From 4c629c2beef8b3bae6ee13bbeae484315adbf67c Mon Sep 17 00:00:00 2001 From: TellowKrinkle Date: Sat, 18 Jun 2022 01:09:35 -0500 Subject: VideoCommon: Add dynamic vertex loader to ubershaders --- Source/Core/VideoCommon/VertexShaderManager.cpp | 41 +++++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) (limited to 'Source/Core/VideoCommon/VertexShaderManager.cpp') diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp index ce43235977..78bf54da66 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/VertexShaderManager.cpp @@ -606,13 +606,42 @@ void VertexShaderManager::SetMaterialColorChanged(int index) nMaterialsChanged[index] = true; } -void VertexShaderManager::SetVertexFormat(u32 components) +static void UpdateValue(bool* dirty, u32* old_value, u32 new_value) { - if (components != constants.components) - { - constants.components = components; - dirty = true; - } + 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, u32 (*old_value)[N], + const AttributeFormat (&attribute)[N]) +{ + 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) -- cgit v1.2.3 From 1eb3aaa5484a05037d51899ff35d9c553962373e Mon Sep 17 00:00:00 2001 From: TellowKrinkle Date: Wed, 3 Aug 2022 01:13:55 -0500 Subject: VideoCommon: Use std::array in PortableVertexDeclaration --- Source/Core/VideoCommon/VertexShaderManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Source/Core/VideoCommon/VertexShaderManager.cpp') diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp index 78bf54da66..b74c820271 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/VertexShaderManager.cpp @@ -626,8 +626,8 @@ static void UpdateOffset(bool* dirty, bool include_components, u32* old_value, } template -static void UpdateOffsets(bool* dirty, bool include_components, u32 (*old_value)[N], - const AttributeFormat (&attribute)[N]) +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]); -- cgit v1.2.3