From 0875de0727cbe5a7e3bfa0874d9ff856d9bd2763 Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Thu, 25 Mar 2021 15:59:17 -0500 Subject: [PATCH] ImGui: move generic vertex cache into ImGui's video class. --- src/core/common/imgui/video.cpp | 17 +++++++++++++---- src/core/hle/D3D8/Direct3D9/Direct3D9.cpp | 17 ----------------- src/core/hle/D3D8/XbVertexBuffer.cpp | 4 +++- src/core/hle/D3D8/XbVertexBuffer.h | 4 +++- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/core/common/imgui/video.cpp b/src/core/common/imgui/video.cpp index f1d6e57f2..027cf9a3a 100644 --- a/src/core/common/imgui/video.cpp +++ b/src/core/common/imgui/video.cpp @@ -12,6 +12,7 @@ #include "EmuShared.h" #include "core/kernel/init/CxbxKrnl.h" +#include "core/hle/D3D8/XbVertexBuffer.h" bool ImGuiVideo::Initialize() { @@ -27,14 +28,22 @@ void ImGuiVideo::Shutdown() void ImGuiVideo::DrawMenu() { if (ImGui::BeginMenu("Video")) { - ImGui::MenuItem("Show Vertex Stats", NULL, &m_windows.cache_stats_vertex); + ImGui::MenuItem("Debug Vertex Buffer Cache Stats", NULL, &m_windows.cache_stats_vertex); ImGui::EndMenu(); } } void ImGuiVideo::DrawWidgets(bool is_focus, ImGuiWindowFlags input_handler) { - //TODO: move into plugin class usage. - extern void CxbxImGui_Video_DrawWidgets(bool, ImGuiWindowFlags, bool); - CxbxImGui_Video_DrawWidgets(is_focus, input_handler, m_windows.cache_stats_vertex); + // Render vertex buffer cache stats + if (m_windows.cache_stats_vertex) { + ImGui::SetNextWindowPos(ImVec2(IMGUI_MIN_DIST_SIDE, IMGUI_MIN_DIST_TOP), ImGuiCond_FirstUseEver, ImVec2(0.0f, 0.0f)); + ImGui::SetNextWindowSize(ImVec2(200, 275), ImGuiCond_FirstUseEver); + if (ImGui::Begin("Debugging stats", nullptr, input_handler | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysVerticalScrollbar)) { + if (ImGui::CollapsingHeader("Vertex Buffer Cache", ImGuiTreeNodeFlags_DefaultOpen)) { + VertexBufferConverter.DrawCacheStats(); + } + ImGui::End(); + } + } } diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 80dcb6f6e..aef700580 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -128,8 +128,6 @@ static size_t g_QuadToTriangleHostIndexBuffer_Size = 0; // static INDEX16 *g_pQuadToTriangleIndexData = nullptr; static size_t g_QuadToTriangleIndexData_Size = 0; // = NrOfQuadIndices -static CxbxVertexBufferConverter VertexBufferConverter = {}; - struct { xbox::X_D3DSurface Surface; RECT SrcRect; @@ -186,21 +184,6 @@ float g_Xbox_BackbufferScaleY = 1; static constexpr size_t INDEX_BUFFER_CACHE_SIZE = 10000; -// ImGui -void CxbxImGui_Video_DrawWidgets(bool is_focus, ImGuiWindowFlags input_handler, bool show_vertex_stats) -{ - if (show_vertex_stats) { - ImGui::SetNextWindowPos(ImVec2(IMGUI_MIN_DIST_SIDE, IMGUI_MIN_DIST_TOP), ImGuiCond_FirstUseEver, ImVec2(0.0f, 0.0f)); - ImGui::SetNextWindowSize(ImVec2(200, 275), ImGuiCond_FirstUseEver); - if (ImGui::Begin("Debugging stats", nullptr, input_handler | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysVerticalScrollbar)) { - if (ImGui::CollapsingHeader("Vertex Buffers", ImGuiTreeNodeFlags_DefaultOpen)) { - VertexBufferConverter.ShowImGuiStats(); - } - ImGui::End(); - } - } -} - static void CxbxImGui_RenderD3D9(ImGuiUI* m_imgui, IDirect3DSurface9* renderTarget) { ImGui_ImplDX9_NewFrame(); diff --git a/src/core/hle/D3D8/XbVertexBuffer.cpp b/src/core/hle/D3D8/XbVertexBuffer.cpp index 9dbaeb48c..05391e2a6 100644 --- a/src/core/hle/D3D8/XbVertexBuffer.cpp +++ b/src/core/hle/D3D8/XbVertexBuffer.cpp @@ -46,6 +46,8 @@ #define MAX_STREAM_NOT_USED_TIME (2 * CLOCKS_PER_SEC) // TODO: Trim the not used time +CxbxVertexBufferConverter VertexBufferConverter = {}; + // Inline vertex buffer emulation xbox::X_D3DPRIMITIVETYPE g_InlineVertexBuffer_PrimitiveType = xbox::X_D3DPT_INVALID; uint32_t g_InlineVertexBuffer_WrittenRegisters = 0; // A bitmask, indicating which registers have been set in g_InlineVertexBuffer_Table @@ -218,7 +220,7 @@ CxbxPatchedStream& CxbxVertexBufferConverter::GetPatchedStream(uint64_t dataKey, return stream; } -void CxbxVertexBufferConverter::ShowImGuiStats() +void CxbxVertexBufferConverter::DrawCacheStats() { const ULONG falsePositives = std::exchange(m_TotalLookupSuccesses, 0) - m_TotalCacheHits; const ULONG totalMisses = m_VertexStreamHashMisses + m_DataNotInCacheMisses; diff --git a/src/core/hle/D3D8/XbVertexBuffer.h b/src/core/hle/D3D8/XbVertexBuffer.h index 5905e849a..45c6be246 100644 --- a/src/core/hle/D3D8/XbVertexBuffer.h +++ b/src/core/hle/D3D8/XbVertexBuffer.h @@ -78,7 +78,7 @@ class CxbxVertexBufferConverter public: CxbxVertexBufferConverter() = default; void Apply(CxbxDrawContext *pPatchDesc); - void ShowImGuiStats(); + void DrawCacheStats(); private: struct StreamKey { @@ -116,6 +116,8 @@ class CxbxVertexBufferConverter void ConvertStream(CxbxDrawContext *pPatchDesc, CxbxVertexDeclaration* pCxbxVertexDeclaration, UINT uiStream); }; +extern CxbxVertexBufferConverter VertexBufferConverter; + // Inline vertex buffer emulation extern xbox::X_D3DPRIMITIVETYPE g_InlineVertexBuffer_PrimitiveType;