From dd9ecd5f65d1a44d9245fc06203716656f55ede7 Mon Sep 17 00:00:00 2001 From: nmzik Date: Fri, 4 Sep 2026 03:09:00 +0200 Subject: [PATCH] Revert "shader: separate comparison image bindings" This reverts commit d762d24f7338ca784ba9d6c0bcd192f8d708e249. --- .../backend/spirv/spirvEmitterAnalysis.cpp | 3 +- src/graphics/shader/recompiler/ir/ShaderIR.h | 37 ++++++--------- tests/ResourceTrackingTests.cpp | 29 ++++-------- tests/ShaderRecompilerComputeTests.cpp | 45 +------------------ 4 files changed, 26 insertions(+), 88 deletions(-) diff --git a/src/graphics/shader/recompiler/backend/spirv/spirvEmitterAnalysis.cpp b/src/graphics/shader/recompiler/backend/spirv/spirvEmitterAnalysis.cpp index a3d4ccde5..d0555440a 100644 --- a/src/graphics/shader/recompiler/backend/spirv/spirvEmitterAnalysis.cpp +++ b/src/graphics/shader/recompiler/backend/spirv/spirvEmitterAnalysis.cpp @@ -158,8 +158,7 @@ uint32_t ImageType(EmitterState& state, const IR::ImageResource& image) { } const auto& info = ImageDimensionInfoFor(image.dimension); return state.builder.Type(OpTypeImage, - {ImageScalarType(state, image.numeric_class), info.spirv_dimension, - image.depth_compare ? 1u : 0u, + {ImageScalarType(state, image.numeric_class), info.spirv_dimension, 0, info.arrayed, info.multisampled, sampled, format}); } diff --git a/src/graphics/shader/recompiler/ir/ShaderIR.h b/src/graphics/shader/recompiler/ir/ShaderIR.h index cc0d3f14e..0ddc30a51 100644 --- a/src/graphics/shader/recompiler/ir/ShaderIR.h +++ b/src/graphics/shader/recompiler/ir/ShaderIR.h @@ -253,10 +253,9 @@ struct StageOutput { bool operator==(const StageOutput& other) const = default; }; -inline constexpr uint32_t FirstImageBinding = 1u; -inline constexpr uint32_t FirstDepthComparisonImageBinding = 22u; -inline constexpr uint32_t FirstStorageImageBinding = 29u; -inline constexpr uint32_t ImageBindingCount = 43u; +inline constexpr uint32_t FirstImageBinding = 1u; +inline constexpr uint32_t FirstStorageImageBinding = 22u; +inline constexpr uint32_t ImageBindingCount = 36u; enum class DescriptorBindingKind : uint32_t { Buffers = 0u, @@ -269,8 +268,8 @@ enum class DescriptorBindingKind : uint32_t { Count, }; -static_assert(static_cast(DescriptorBindingKind::Samplers) == 44u); -static_assert(static_cast(DescriptorBindingKind::Count) == 50u); +static_assert(static_cast(DescriptorBindingKind::Samplers) == 37u); +static_assert(static_cast(DescriptorBindingKind::Count) == 43u); struct PushData { static constexpr uint32_t DwordCount = 32; @@ -314,10 +313,9 @@ DescriptorBindingForImage(const ImageResource& image) { constexpr uint32_t SampledFloatBinding = 1u; constexpr uint32_t SampledUintBinding = 8u; constexpr uint32_t SampledSintBinding = 15u; - constexpr uint32_t SampledDepthBinding = FirstDepthComparisonImageBinding; - constexpr uint32_t StorageFloatBinding = FirstStorageImageBinding; - constexpr uint32_t StorageUintBinding = 34u; - constexpr uint32_t AtomicUintBinding = 39u; + constexpr uint32_t StorageFloatBinding = 22u; + constexpr uint32_t StorageUintBinding = 27u; + constexpr uint32_t AtomicUintBinding = 32u; uint32_t base = 0; bool sampled = false; @@ -326,19 +324,12 @@ DescriptorBindingForImage(const ImageResource& image) { return std::nullopt; } sampled = true; - if (image.depth_compare) { - if (image.numeric_class != Prospero::TextureNumericClass::Float) { - return std::nullopt; - } - base = SampledDepthBinding; - } else { - switch (image.numeric_class) { - case Prospero::TextureNumericClass::Float: base = SampledFloatBinding; break; - case Prospero::TextureNumericClass::Uint: base = SampledUintBinding; break; - case Prospero::TextureNumericClass::Sint: base = SampledSintBinding; break; - case Prospero::TextureNumericClass::Unsupported: return std::nullopt; - default: return std::nullopt; - } + switch (image.numeric_class) { + case Prospero::TextureNumericClass::Float: base = SampledFloatBinding; break; + case Prospero::TextureNumericClass::Uint: base = SampledUintBinding; break; + case Prospero::TextureNumericClass::Sint: base = SampledSintBinding; break; + case Prospero::TextureNumericClass::Unsupported: return std::nullopt; + default: return std::nullopt; } } else if (image.resource_class == ImageResourceClass::Storage) { if (image.atomic) { diff --git a/tests/ResourceTrackingTests.cpp b/tests/ResourceTrackingTests.cpp index 4807b3d23..f48762ee4 100644 --- a/tests/ResourceTrackingTests.cpp +++ b/tests/ResourceTrackingTests.cpp @@ -1240,15 +1240,15 @@ void TestShaderInfoAndBindingLayout() { void TestImageBindingAbi() { using NumericClass = Libs::Graphics::Prospero::TextureNumericClass; - Check(ImageBindingCount == 43u && + Check(ImageBindingCount == 36u && static_cast(DescriptorBindingKind::Buffers) == 0u && - static_cast(DescriptorBindingKind::Samplers) == 44u && - static_cast(DescriptorBindingKind::Gds) == 45u && - static_cast(DescriptorBindingKind::BdaPagetable) == 46u && - static_cast(DescriptorBindingKind::FaultBuffer) == 47u && - static_cast(DescriptorBindingKind::FlattenedSrt) == 48u && - static_cast(DescriptorBindingKind::ShaderData) == 49u && - static_cast(DescriptorBindingKind::Count) == 50u, + static_cast(DescriptorBindingKind::Samplers) == 37u && + static_cast(DescriptorBindingKind::Gds) == 38u && + static_cast(DescriptorBindingKind::BdaPagetable) == 39u && + static_cast(DescriptorBindingKind::FaultBuffer) == 40u && + static_cast(DescriptorBindingKind::FlattenedSrt) == 41u && + static_cast(DescriptorBindingKind::ShaderData) == 42u && + static_cast(DescriptorBindingKind::Count) == 43u, "native descriptor binding anchors changed"); const std::array sampled_dimensions{ @@ -1271,14 +1271,12 @@ void TestImageBindingAbi() { uint32_t index = 0; const auto CheckBinding = [&](ImageResourceClass resource_class, NumericClass numeric_class, - Decoder::ImageDimension dimension, bool atomic, - bool depth_compare = false) { + Decoder::ImageDimension dimension, bool atomic) { ImageResource image; image.resource_class = resource_class; image.numeric_class = numeric_class; image.dimension = dimension; image.atomic = atomic; - image.depth_compare = depth_compare; const auto kind = DescriptorBindingForImage(image); Check(kind.has_value() && static_cast(*kind) == FirstImageBinding + index && @@ -1298,10 +1296,6 @@ void TestImageBindingAbi() { false); } } - for (const auto dimension : sampled_dimensions) { - CheckBinding(ImageResourceClass::Sampled, NumericClass::Float, dimension, - false, true); - } for (const auto numeric_class : storage_classes) { for (const auto dimension : storage_dimensions) { CheckBinding(ImageResourceClass::Storage, numeric_class, dimension, @@ -1328,11 +1322,6 @@ void TestImageBindingAbi() { image.numeric_class = NumericClass::Unsupported; Check(Invalid(image), "unsupported sampled class received a descriptor binding"); - image.numeric_class = NumericClass::Uint; - image.depth_compare = true; - Check(Invalid(image), - "integer comparison image received a descriptor binding"); - image.depth_compare = false; image.numeric_class = static_cast(UINT32_MAX); Check(Invalid(image), "invalid sampled class received a descriptor binding"); image.numeric_class = NumericClass::Float; diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index ed80f720b..21a6cf09d 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -20440,7 +20440,7 @@ TestCase ImageSampleOpcodeAliasUsesNormalCoords() { test.code = code; test.opcodes = {O::V_MOV_B32, O::IMAGE_SAMPLE, O::BUFFER_STORE_DWORD, O::S_ENDPGM}; - test.required_spirv = {"OpTypeImage %float 2D 0", "OpImageSampleExplicitLod"}; + test.required_spirv = {"OpImageSampleExplicitLod"}; test.forbidden_spirv = {"UnpackHalf2x16"}; test.compile_only = true; return test; @@ -20494,8 +20494,7 @@ TestCase ImageSampleA16CompareBiasRdna2AddressOrder() { test.code = code; test.opcodes = {O::V_MOV_B32, O::IMAGE_SAMPLE, O::BUFFER_STORE_DWORD, O::S_ENDPGM}; - test.required_spirv = {"OpTypeImage %float 2D 1", - "OpImageSampleDrefExplicitLod", "UnpackHalf2x16"}; + test.required_spirv = {"OpImageSampleDrefExplicitLod", "UnpackHalf2x16"}; test.compile_only = true; return test; } @@ -24045,42 +24044,6 @@ void CheckNativeImageDescriptorTypes() { std::printf("[host] %-32s ok\n", "NativeImageDescriptorTypes"); } -void CheckDepthComparisonBindings() { - using namespace ShaderRecompiler::IR; - - ImageResource color{}; - color.resource_class = ImageResourceClass::Sampled; - color.numeric_class = Prospero::TextureNumericClass::Float; - color.dimension = ShaderRecompiler::Decoder::ImageDimension::Dim2D; - color.read = true; - auto depth = color; - depth.depth_compare = true; - - const auto color_kind = DescriptorBindingForImage(color); - const auto depth_kind = DescriptorBindingForImage(depth); - Program program; - program.info.images = {color, depth}; - program.shader_info_complete = true; - AllocateBindings(program); - - Require("DepthComparisonBindings", "separate classes", - color_kind.has_value() && depth_kind.has_value() && - color_kind != depth_kind && - ImageBindingResourceClass(*color_kind) == - ImageResourceClass::Sampled && - ImageBindingResourceClass(*depth_kind) == - ImageResourceClass::Sampled, - "ordinary and comparison images share a descriptor class"); - const auto *color_binding = FindBinding(program.bindings, *color_kind); - const auto *depth_binding = FindBinding(program.bindings, *depth_kind); - Require("DepthComparisonBindings", "separate arrays", - color_binding != nullptr && depth_binding != nullptr && - color_binding->resources == std::vector{0u} && - depth_binding->resources == std::vector{1u}, - "ordinary and comparison images share a descriptor array"); - std::printf("[host] %-32s ok\n", "DepthComparisonBindings"); -} - #if KYTY_PLATFORM != KYTY_PLATFORM_WINDOWS void CheckShaderRecompilerFatalContracts() { ExpectFatal("InvalidDescriptorBindingRejection", [] { @@ -26116,9 +26079,6 @@ int main(int argc, char **argv) { VulkanHarness vulkan; CheckSampledDepthResource(); CheckSampledDepthDescriptor(vulkan.RuntimeRenderer()); - CheckDepthComparisonBindings(); - RunCase(nullptr, ImageSampleOpcodeAliasUsesNormalCoords()); - RunCase(nullptr, ImageSampleA16CompareBiasRdna2AddressOrder()); return 0; } if (argc == 2 && std::strcmp(argv[1], "--storage-bgra-only") == 0) { @@ -26194,7 +26154,6 @@ int main(int argc, char **argv) { #endif CheckImageSamplerSpecialization(); CheckNativeImageDescriptorTypes(); - CheckDepthComparisonBindings(); CheckClipControlDepthClipState(); CheckReferenceClockScale(); CheckVulkan13FeatureRequirements();