From 3ed03f7a3d4f66981af2ab023d87c01ca04c7326 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 3 Apr 2018 12:33:08 +0200 Subject: [PATCH] [hud] Added configurable HUD HUD elements can be enabled individually using a comma-separated list. Supported options include: - fps: Displays the framerate - devinfo: Displays device info Passing "1" has the same effect as "fps,devinfo". --- src/dxvk/hud/dxvk_hud.cpp | 27 ++++++++++++------- src/dxvk/hud/dxvk_hud.h | 12 +++++++-- src/dxvk/hud/dxvk_hud_config.cpp | 45 ++++++++++++++++++++++++++++++++ src/dxvk/hud/dxvk_hud_config.h | 40 ++++++++++++++++++++++++++++ src/dxvk/meson.build | 1 + 5 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 src/dxvk/hud/dxvk_hud_config.cpp create mode 100644 src/dxvk/hud/dxvk_hud_config.h diff --git a/src/dxvk/hud/dxvk_hud.cpp b/src/dxvk/hud/dxvk_hud.cpp index 70977630e..0b4a58cf7 100644 --- a/src/dxvk/hud/dxvk_hud.cpp +++ b/src/dxvk/hud/dxvk_hud.cpp @@ -4,8 +4,11 @@ namespace dxvk::hud { - Hud::Hud(const Rc& device) - : m_device (device), + Hud::Hud( + const Rc& device, + const HudConfig& config) + : m_config (config), + m_device (device), m_context (m_device->createContext()), m_textRenderer (m_device, m_context), m_uniformBuffer (createUniformBuffer()), @@ -37,13 +40,13 @@ namespace dxvk::hud { Rc Hud::createHud(const Rc& device) { - const std::string hudConfig = env::getEnvVar(L"DXVK_HUD"); + HudConfig config(env::getEnvVar(L"DXVK_HUD")); - if (hudConfig.size() == 0 || hudConfig == "0") + if (config.elements.isClear()) return nullptr; // TODO implement configuration options for the HUD - return new Hud(device); + return new Hud(device, config); } @@ -65,10 +68,16 @@ namespace dxvk::hud { m_textRenderer.beginFrame(m_context); HudPos position = { 8.0f, 24.0f }; - position = m_hudDeviceInfo.renderText( - m_context, m_textRenderer, position); - position = m_hudFps.renderText( - m_context, m_textRenderer, position); + + if (m_config.elements.test(HudElement::DeviceInfo)) { + position = m_hudDeviceInfo.renderText( + m_context, m_textRenderer, position); + } + + if (m_config.elements.test(HudElement::Framerate)) { + position = m_hudFps.renderText( + m_context, m_textRenderer, position); + } } diff --git a/src/dxvk/hud/dxvk_hud.h b/src/dxvk/hud/dxvk_hud.h index 1ac256dd9..e8aaf7fc0 100644 --- a/src/dxvk/hud/dxvk_hud.h +++ b/src/dxvk/hud/dxvk_hud.h @@ -4,12 +4,17 @@ #include "../util/util_env.h" +#include "dxvk_hud_config.h" #include "dxvk_hud_devinfo.h" #include "dxvk_hud_fps.h" #include "dxvk_hud_text.h" namespace dxvk::hud { + /** + * \brief HUD uniform data + * Shader data for the HUD. + */ struct HudUniformData { VkExtent2D surfaceSize; }; @@ -24,8 +29,9 @@ namespace dxvk::hud { public: - explicit Hud( - const Rc& device); + Hud( + const Rc& device, + const HudConfig& config); ~Hud(); @@ -62,6 +68,8 @@ namespace dxvk::hud { private: + const HudConfig m_config; + const Rc m_device; const Rc m_context; diff --git a/src/dxvk/hud/dxvk_hud_config.cpp b/src/dxvk/hud/dxvk_hud_config.cpp new file mode 100644 index 000000000..dcdb8065a --- /dev/null +++ b/src/dxvk/hud/dxvk_hud_config.cpp @@ -0,0 +1,45 @@ +#include "dxvk_hud_config.h" + +namespace dxvk { + + const std::unordered_map g_hudElements = {{ + { "devinfo", HudElement::DeviceInfo }, + { "fps", HudElement::Framerate }, + }}; + + + HudConfig::HudConfig() { + + } + + + HudConfig::HudConfig(const std::string& configStr) { + if (configStr == "1") { + this->elements.set( + HudElement::DeviceInfo, + HudElement::Framerate); + } else { + std::string::size_type pos = 0; + std::string::size_type end = 0; + + while (pos < configStr.size()) { + end = configStr.find(',', pos); + + if (end == std::string::npos) + end = configStr.size(); + + std::string configPart = configStr.substr(pos, end - pos); + + auto element = g_hudElements.find(configPart); + + if (element != g_hudElements.cend()) { + this->elements.set(element->second); + Logger::debug(str::format("Hud: Enabled ", configPart)); + } + + pos = end + 1; + } + } + } + +} \ No newline at end of file diff --git a/src/dxvk/hud/dxvk_hud_config.h b/src/dxvk/hud/dxvk_hud_config.h new file mode 100644 index 000000000..ab7911c71 --- /dev/null +++ b/src/dxvk/hud/dxvk_hud_config.h @@ -0,0 +1,40 @@ +#pragma once + +#include "../dxvk_include.h" + +namespace dxvk { + + /** + * \brief HUD element + * + * These flags can be used to enable + * or disable HUD elements on demand. + */ + enum class HudElement { + DeviceInfo = 0, + Framerate = 1, + }; + + using HudElements = Flags; + + + /** + * \brief HUD configuration + */ + struct HudConfig { + HudConfig(); + HudConfig(const std::string& configStr); + + HudElements elements; + }; + + + /** + * \brief Gets HUD configuration from config strnig + * + * \param [in] configStr Configuration string + * \returns HUD configuration struct + */ + HudConfig parseHudConfigStr(const std::string& configStr); + +} \ No newline at end of file diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index 1a5e54d61..da1203bd4 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -48,6 +48,7 @@ dxvk_src = files([ 'dxvk_util.cpp', 'hud/dxvk_hud.cpp', + 'hud/dxvk_hud_config.cpp', 'hud/dxvk_hud_devinfo.cpp', 'hud/dxvk_hud_font.cpp', 'hud/dxvk_hud_fps.cpp',