From b82ba53b6b1a6831ae44885128ea074163f77fe4 Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Fri, 4 Apr 2025 00:40:50 +0200 Subject: [PATCH] Fix rendering bugs when using ubershaders --- src/common/rendering/vulkan/shaders/vk_shader.cpp | 2 +- src/common/rendering/vulkan/shaders/vk_shader.h | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index b7e8e254e..725496a8c 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -93,7 +93,7 @@ void VkShaderManager::Deinit() VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key, bool isUberShader) { - VkShaderProgram& program = isUberShader ? generic[key.Layout.AsDWORD] : specialized[key]; + VkShaderProgram& program = isUberShader ? generic[key.GeneralizedShaderKey()] : specialized[key]; if (program.frag) return &program; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 023ac93ce..29ab2b45e 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -136,6 +136,14 @@ public: uint32_t AsDWORD = 0; } Layout; + inline uint64_t GeneralizedShaderKey() const + { + return uint64_t(Layout.AsDWORD) | + (uint64_t(EffectState) << 32) | + ((uint64_t(SpecialEffect) & 0xFF) << (32 + 16)) | + ((uint64_t(VertexFormat) & 0xFF) << (32 + 16 + 8)); + } + bool operator<(const VkShaderKey& other) const { return memcmp(this, &other, sizeof(VkShaderKey)) < 0; } bool operator==(const VkShaderKey& other) const { return memcmp(this, &other, sizeof(VkShaderKey)) == 0; } bool operator!=(const VkShaderKey& other) const { return memcmp(this, &other, sizeof(VkShaderKey)) != 0; } @@ -186,7 +194,7 @@ private: VulkanRenderDevice* fb = nullptr; - std::map generic; + std::map generic; std::map specialized; std::list PPShaders;