From 408b09da31986b11cc48c4ae91ede8ec66408222 Mon Sep 17 00:00:00 2001 From: Robin Kertels Date: Sun, 19 Mar 2023 23:28:25 +0100 Subject: [PATCH] VideoCommon:VertexShaderManager: Inline SetVertexFormat & UpdateValue/Offset --- .../Core/VideoCommon/VertexShaderManager.cpp | 38 ----------------- Source/Core/VideoCommon/VertexShaderManager.h | 41 ++++++++++++++++++- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp index 2408281da6..276b400ab3 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/VertexShaderManager.cpp @@ -621,44 +621,6 @@ void VertexShaderManager::SetMaterialColorChanged(int index) m_materials_changed[index] = true; } -static void UpdateValue(bool* dirty, u32* old_value, u32 new_value) -{ - if (*old_value == new_value) - return; - *old_value = new_value; - *dirty = true; -} - -static void UpdateOffset(bool* dirty, bool include_components, u32* old_value, - const AttributeFormat& attribute) -{ - if (!attribute.enable) - return; - u32 new_value = attribute.offset / 4; // GPU uses uint offsets - if (include_components) - new_value |= attribute.components << 16; - UpdateValue(dirty, old_value, new_value); -} - -template -static void UpdateOffsets(bool* dirty, bool include_components, std::array* old_value, - const std::array& attribute) -{ - for (size_t i = 0; i < N; i++) - UpdateOffset(dirty, include_components, &(*old_value)[i], attribute[i]); -} - -void VertexShaderManager::SetVertexFormat(u32 components, const PortableVertexDeclaration& format) -{ - UpdateValue(&dirty, &constants.components, components); - UpdateValue(&dirty, &constants.vertex_stride, format.stride / 4); - UpdateOffset(&dirty, true, &constants.vertex_offset_position, format.position); - UpdateOffset(&dirty, false, &constants.vertex_offset_posmtx, format.posmtx); - UpdateOffsets(&dirty, true, &constants.vertex_offset_texcoords, format.texcoords); - UpdateOffsets(&dirty, false, &constants.vertex_offset_colors, format.colors); - UpdateOffsets(&dirty, false, &constants.vertex_offset_normals, format.normals); -} - void VertexShaderManager::SetTexMatrixInfoChanged(int index) { // TODO: Should we track this with more precision, like which indices changed? diff --git a/Source/Core/VideoCommon/VertexShaderManager.h b/Source/Core/VideoCommon/VertexShaderManager.h index 320e04985d..fdc8da5231 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.h +++ b/Source/Core/VideoCommon/VertexShaderManager.h @@ -11,6 +11,7 @@ #include "Common/CommonTypes.h" #include "Common/Matrix.h" #include "VideoCommon/ConstantManager.h" +#include "VideoCommon/NativeVertexFormat.h" class PointerWrap; struct PortableVertexDeclaration; @@ -34,7 +35,6 @@ public: void SetProjectionChanged(); void SetMaterialColorChanged(int index); - void SetVertexFormat(u32 components, const PortableVertexDeclaration& format); void SetTexMatrixInfoChanged(int index); void SetLightingConfigChanged(); @@ -49,6 +49,45 @@ public: VertexShaderConstants constants{}; bool dirty = false; + static DOLPHIN_FORCE_INLINE void UpdateValue(bool* dirty, u32* old_value, u32 new_value) + { + if (*old_value == new_value) + return; + *old_value = new_value; + *dirty = true; + } + + static DOLPHIN_FORCE_INLINE void UpdateOffset(bool* dirty, bool include_components, + u32* old_value, const AttributeFormat& attribute) + { + if (!attribute.enable) + return; + u32 new_value = attribute.offset / 4; // GPU uses uint offsets + if (include_components) + new_value |= attribute.components << 16; + UpdateValue(dirty, old_value, new_value); + } + + template + static DOLPHIN_FORCE_INLINE void UpdateOffsets(bool* dirty, bool include_components, + std::array* old_value, + const std::array& attribute) + { + for (size_t i = 0; i < N; i++) + UpdateOffset(dirty, include_components, &(*old_value)[i], attribute[i]); + } + + DOLPHIN_FORCE_INLINE void SetVertexFormat(u32 components, const PortableVertexDeclaration& format) + { + UpdateValue(&dirty, &constants.components, components); + UpdateValue(&dirty, &constants.vertex_stride, format.stride / 4); + UpdateOffset(&dirty, true, &constants.vertex_offset_position, format.position); + UpdateOffset(&dirty, false, &constants.vertex_offset_posmtx, format.posmtx); + UpdateOffsets(&dirty, true, &constants.vertex_offset_texcoords, format.texcoords); + UpdateOffsets(&dirty, false, &constants.vertex_offset_colors, format.colors); + UpdateOffsets(&dirty, false, &constants.vertex_offset_normals, format.normals); + } + private: alignas(16) std::array m_projection_matrix;