From 38ad868214aea3a066948b23a8bec70303d0789f Mon Sep 17 00:00:00 2001
From: Philip Rebohle <philip.rebohle@tu-dortmund.de>
Date: Tue, 28 Jan 2020 13:57:56 +0100
Subject: [PATCH] [hud] Add parameter to allow placing HUD items

---
 src/d3d9/d3d9_swapchain.cpp  |  2 +-
 src/dxvk/hud/dxvk_hud.cpp    | 20 ++++++++++----------
 src/dxvk/hud/dxvk_hud.h      |  4 ++--
 src/dxvk/hud/dxvk_hud_item.h | 12 +++++++++---
 4 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp
index e30d0153..c307c1c2 100644
--- a/src/d3d9/d3d9_swapchain.cpp
+++ b/src/d3d9/d3d9_swapchain.cpp
@@ -1024,7 +1024,7 @@ namespace dxvk {
     m_hud = hud::Hud::createHud(m_device);
 
     if (m_hud != nullptr)
-      m_hud->addItem<hud::HudSamplerCount>("samplers", m_parent);
+      m_hud->addItem<hud::HudSamplerCount>("samplers", -1, m_parent);
   }
 
 
diff --git a/src/dxvk/hud/dxvk_hud.cpp b/src/dxvk/hud/dxvk_hud.cpp
index 6576c504..cdf8ddee 100644
--- a/src/dxvk/hud/dxvk_hud.cpp
+++ b/src/dxvk/hud/dxvk_hud.cpp
@@ -29,16 +29,16 @@ namespace dxvk::hud {
                                 | VK_COLOR_COMPONENT_B_BIT
                                 | VK_COLOR_COMPONENT_A_BIT;
 
-    addItem<HudVersionItem>("version");
-    addItem<HudDeviceInfoItem>("devinfo", m_device);
-    addItem<HudFpsItem>("fps");
-    addItem<HudFrameTimeItem>("frametimes");
-    addItem<HudSubmissionStatsItem>("submissions", device);
-    addItem<HudDrawCallStatsItem>("drawcalls", device);
-    addItem<HudPipelineStatsItem>("pipelines", device);
-    addItem<HudMemoryStatsItem>("memory", device);
-    addItem<HudGpuLoadItem>("gpuload", device);
-    addItem<HudCompilerActivityItem>("compiler", device);
+    addItem<HudVersionItem>("version", -1);
+    addItem<HudDeviceInfoItem>("devinfo", -1, m_device);
+    addItem<HudFpsItem>("fps", -1);
+    addItem<HudFrameTimeItem>("frametimes", -1);
+    addItem<HudSubmissionStatsItem>("submissions", -1, device);
+    addItem<HudDrawCallStatsItem>("drawcalls", -1, device);
+    addItem<HudPipelineStatsItem>("pipelines", -1, device);
+    addItem<HudMemoryStatsItem>("memory", -1, device);
+    addItem<HudGpuLoadItem>("gpuload", -1, device);
+    addItem<HudCompilerActivityItem>("compiler", -1, device);
   }
   
   
diff --git a/src/dxvk/hud/dxvk_hud.h b/src/dxvk/hud/dxvk_hud.h
index f70fda0c..3dc1b6f7 100644
--- a/src/dxvk/hud/dxvk_hud.h
+++ b/src/dxvk/hud/dxvk_hud.h
@@ -57,8 +57,8 @@ namespace dxvk::hud {
      * \param [in] args Constructor arguments
      */
     template<typename T, typename... Args>
-    void addItem(const char* name, Args... args) {
-      m_hudItems.add<T>(name, std::forward<Args>(args)...);
+    void addItem(const char* name, int32_t at, Args... args) {
+      m_hudItems.add<T>(name, at, std::forward<Args>(args)...);
     }
     
     /**
diff --git a/src/dxvk/hud/dxvk_hud_item.h b/src/dxvk/hud/dxvk_hud_item.h
index 8a773755..d71af880 100644
--- a/src/dxvk/hud/dxvk_hud_item.h
+++ b/src/dxvk/hud/dxvk_hud_item.h
@@ -76,10 +76,11 @@ namespace dxvk::hud {
      *
      * \tparam T The HUD item type
      * \param [in] name HUD item name
+     * \param [in] at Position at which to insert the item
      * \param [in] args Constructor arguments
      */
     template<typename T, typename... Args>
-    void add(const char* name, Args... args) {
+    void add(const char* name, int32_t at, Args... args) {
       bool enable = m_enableFull;
 
       if (!enable) {
@@ -87,8 +88,13 @@ namespace dxvk::hud {
         enable = entry != m_enabled.end();
       }
 
-      if (enable)
-        m_items.push_back(new T(std::forward<Args>(args)...));
+      if (at < 0 || at > int32_t(m_items.size()))
+        at = m_items.size();
+
+      if (enable) {
+        m_items.insert(m_items.begin() + at,
+          new T(std::forward<Args>(args)...));
+      }
     }
 
   private: