From 33208a545a00c3b4060fefdcfb71803ba22debfc Mon Sep 17 00:00:00 2001 From: nmzik Date: Sun, 18 Oct 2026 03:20:38 +0200 Subject: [PATCH] shader: remove artificial sampled image and sampler pair limit --- src/graphics/shader/recompiler/ir/ShaderIR.h | 1 - .../recompiler/ir/passes/ResourceTracking.cpp | 3 -- tests/ResourceTrackingTests.cpp | 33 +++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/graphics/shader/recompiler/ir/ShaderIR.h b/src/graphics/shader/recompiler/ir/ShaderIR.h index b1b0edbb1..bfcc36e0b 100644 --- a/src/graphics/shader/recompiler/ir/ShaderIR.h +++ b/src/graphics/shader/recompiler/ir/ShaderIR.h @@ -495,7 +495,6 @@ struct ShaderInfo { static constexpr uint32_t MaxBufferRoots = 64; static constexpr uint32_t MaxImages = 64; static constexpr uint32_t MaxSamplers = 32; - static constexpr uint32_t MaxSampledPairs = 64; std::vector buffers; std::vector images; diff --git a/src/graphics/shader/recompiler/ir/passes/ResourceTracking.cpp b/src/graphics/shader/recompiler/ir/passes/ResourceTracking.cpp index 677e9a5ca..e22308107 100644 --- a/src/graphics/shader/recompiler/ir/passes/ResourceTracking.cpp +++ b/src/graphics/shader/recompiler/ir/passes/ResourceTracking.cpp @@ -3823,9 +3823,6 @@ private: return; } } - if (m_info.sampled_pairs.size() >= ShaderInfo::MaxSampledPairs) { - Fail(pc, "sampled image/sampler pair limit exceeded"); - } m_info.sampled_pairs.push_back({image, sampler, pc}); } diff --git a/tests/ResourceTrackingTests.cpp b/tests/ResourceTrackingTests.cpp index 503a406b5..61ea2aab5 100644 --- a/tests/ResourceTrackingTests.cpp +++ b/tests/ResourceTrackingTests.cpp @@ -4929,6 +4929,38 @@ void TestImagesSamplersAndAliases() { "buffer/image descriptor alias was not linked"); } +void TestIndependentImageSamplerPairs() { + Fixture fixture(ShaderType::Pixel); + const auto address = fixture.ImageAddress(); + MemoryInfo memory; + memory.kind = ResourceKind::Image; + memory.image_dimension = Decoder::ImageDimension::Dim2D; + for (uint32_t use = 0; use < 144; ++use) { + const auto pair = use % 72; + const auto pc = use * 4; + const auto image = fixture.Image( + {Value(pair / 8), Value(0u), Value(0u), Value(0u), Value(0u), + Value(0u), Value(0u), Value(0u)}, pc); + const auto sampler = fixture.Sampler( + {Value(pair % 8), Value(0u), Value(0u), Value(0u)}, pc); + fixture.Emit(ValueOpcode::ImageSampleRaw, + {image, sampler, address, Value(true)}, + fixture.AddMemory(memory, pc)); + } + fixture.PlanAndTrack(); + + Check(fixture.program.info.images.size() == 9 && + fixture.program.info.samplers.size() == 8 && + fixture.program.info.sampled_pairs.size() == 72, + "distinct image/sampler combinations were limited or duplicated"); + for (uint32_t index = 0; index < 72; ++index) { + const auto &pair = fixture.program.info.sampled_pairs[index]; + Check(pair.image == index / 8 && pair.sampler == index % 8 && + pair.first_use_pc == index * 4, + "sampled pair lost its independent resources or first use"); + } +} + void TestSampleAdjustSamplerScratch() { Fixture fixture(ShaderType::Pixel); const auto active = fixture.Emit( @@ -8255,6 +8287,7 @@ int main() { Run("scalar/vector alias", TestScalarAndVectorBufferAlias); Run("runtime unsigned min", TestRuntimeUnsignedMinDescriptor); Run("images and samplers", TestImagesSamplersAndAliases); + Run("independent image/sampler pairs", TestIndependentImageSamplerPairs); Run("SampleAdjust sampler scratch", TestSampleAdjustSamplerScratch); Run("FMASK load specialization", TestFmaskLoadSpecialization); Run("gather LOD sampler validation", TestGatherLodSamplerValidation);