From dfdbeae901d088b3fea68071d1d28bee526e5a15 Mon Sep 17 00:00:00 2001 From: SamG-Coder <13449963+SamG-Coder@users.noreply.github.com> Date: Thu, 1 Oct 2026 20:36:28 +1000 Subject: [PATCH] fix(shader): preserve comparison image flags in disk cache --- core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp | 3 ++- core/shader/recompiler/ShaderDiskCache.cpp | 4 +++- core/shader/recompiler/ShaderDiskCache.hpp | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp b/core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp index 2d2ec1f07..4a549d83a 100644 --- a/core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp @@ -31,7 +31,7 @@ void setEnvironment(const char* name, const std::string& value) { } bool sameBinding(const DescriptorBinding& left, const DescriptorBinding& right) { - return left.kind == right.kind && left.role == right.role && left.descriptorSet == right.descriptorSet && left.binding == right.binding && left.count == right.count && left.guestDescriptor == right.guestDescriptor && left.readOnly == right.readOnly && left.imageShape == right.imageShape && left.samplerDepthCompare == right.samplerDepthCompare && left.imageWritten == right.imageWritten && left.bufferAtomic == right.bufferAtomic && left.bufferWritten == right.bufferWritten; + return left.kind == right.kind && left.role == right.role && left.descriptorSet == right.descriptorSet && left.binding == right.binding && left.count == right.count && left.guestDescriptor == right.guestDescriptor && left.readOnly == right.readOnly && left.imageShape == right.imageShape && left.samplerDepthCompare == right.samplerDepthCompare && left.imageWritten == right.imageWritten && left.imageDepthCompare == right.imageDepthCompare && left.bufferAtomic == right.bufferAtomic && left.bufferWritten == right.bufferWritten; } bool sameBindings(const std::vector& left, const std::vector& right) { @@ -90,6 +90,7 @@ DescriptorBinding sampleBinding(std::uint32_t seed) { binding.readOnly = seed % 2 == 0; binding.imageShape = DescriptorImageShape::Image2DArray; binding.samplerDepthCompare = {true, false, true}; + binding.imageDepthCompare = {false, true, false}; binding.imageWritten = {false, true, true}; binding.bufferAtomic = {true}; binding.bufferWritten = {false, false, true, true, false}; diff --git a/core/shader/recompiler/ShaderDiskCache.cpp b/core/shader/recompiler/ShaderDiskCache.cpp index 1eac07ad0..932ebf10f 100644 --- a/core/shader/recompiler/ShaderDiskCache.cpp +++ b/core/shader/recompiler/ShaderDiskCache.cpp @@ -63,7 +63,7 @@ namespace ShaderRecompiler::ShaderDiskCache { #if defined(__linux__) && defined(__x86_64__) && defined(__GLIBCXX__) static_assert(sizeof(RecompileResult) == 176, "RecompileResult changed: update EncodeResult and DecodeResult"); -static_assert(sizeof(DescriptorBinding) == 224, "DescriptorBinding changed: update the binding encoder"); +static_assert(sizeof(DescriptorBinding) == 264, "DescriptorBinding changed: update the binding encoder"); static_assert(sizeof(VertexAttribute) == 28, "VertexAttribute changed: update the attribute encoder"); static_assert(sizeof(FragmentParameter) == 12, "FragmentParameter changed: update the parameter encoder"); static_assert(sizeof(CompiledShaderInfo) == 304, "CompiledShaderInfo changed: update the info encoder"); @@ -246,6 +246,7 @@ void encodeBinding(Writer& writer, const DescriptorBinding& binding) { writer.Value(binding.imageShape.value_or(DescriptorImageShape::Image1D)); writer.Flags(binding.samplerDepthCompare); writer.Flags(binding.imageWritten); + writer.Flags(binding.imageDepthCompare); writer.Flags(binding.bufferAtomic); writer.Flags(binding.bufferWritten); } @@ -263,6 +264,7 @@ void decodeBinding(Reader& reader, DescriptorBinding& binding) { binding.imageShape = hasShape ? std::optional(shape) : std::nullopt; reader.Flags(binding.samplerDepthCompare); reader.Flags(binding.imageWritten); + reader.Flags(binding.imageDepthCompare); reader.Flags(binding.bufferAtomic); reader.Flags(binding.bufferWritten); } diff --git a/core/shader/recompiler/ShaderDiskCache.hpp b/core/shader/recompiler/ShaderDiskCache.hpp index fa589bf8b..216931eee 100644 --- a/core/shader/recompiler/ShaderDiskCache.hpp +++ b/core/shader/recompiler/ShaderDiskCache.hpp @@ -12,7 +12,7 @@ namespace ShaderRecompiler::ShaderDiskCache { -inline constexpr std::uint32_t FormatVersion = 2; +inline constexpr std::uint32_t FormatVersion = 3; enum class LoadStatus { Loaded,