From 01c2ac5dcd56c2482cb4f74eaf64c4b7c582cff7 Mon Sep 17 00:00:00 2001 From: ryana Date: Tue, 28 Apr 2026 19:37:49 +0800 Subject: [PATCH] bound by cbuf size --- src/shader_recompiler/ir_opt/texture_pass.cpp | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index eb8f866281..47e1ea299d 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp @@ -33,6 +33,7 @@ using TextureInstVector = boost::container::small_vector; constexpr u32 DESCRIPTOR_SIZE = 8; constexpr u32 DESCRIPTOR_SIZE_SHIFT = static_cast(std::countr_zero(DESCRIPTOR_SIZE)); constexpr u32 DEFAULT_DYNAMIC_DESCRIPTOR_COUNT = 8; +constexpr u32 DYNAMIC_DESCRIPTOR_CBUF_BYTES = 16 * 1024; constexpr u32 MAX_DYNAMIC_DESCRIPTOR_COUNT = 64; u32 DynamicDescriptorSizeShift(const IR::U32& dynamic_offset) { @@ -45,7 +46,23 @@ u32 DynamicDescriptorSizeShift(const IR::U32& dynamic_offset) { return DESCRIPTOR_SIZE_SHIFT; } const u32 size_shift{shift.U32()}; - return size_shift < 31 ? size_shift : DESCRIPTOR_SIZE_SHIFT; + return size_shift >= DESCRIPTOR_SIZE_SHIFT && size_shift < 31 ? size_shift + : DESCRIPTOR_SIZE_SHIFT; +} + +u32 DynamicDescriptorCount(u32 base_offset, u32 size_shift) { + if (size_shift >= 31 || base_offset >= DYNAMIC_DESCRIPTOR_CBUF_BYTES) { + return 1; + } + const u32 stride{1U << size_shift}; + const u32 available{DYNAMIC_DESCRIPTOR_CBUF_BYTES - base_offset}; + if (available < DESCRIPTOR_SIZE) { + return 1; + } + const u32 available_count{1U + (available - DESCRIPTOR_SIZE) / stride}; + const u32 desired_count{size_shift == DESCRIPTOR_SIZE_SHIFT ? DEFAULT_DYNAMIC_DESCRIPTOR_COUNT + : MAX_DYNAMIC_DESCRIPTOR_COUNT}; + return std::min(desired_count, available_count); } IR::Opcode IndexedInstruction(const IR::Inst& inst) { @@ -378,8 +395,7 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme .secondary_offset = 0, .secondary_shift_left = 0, .dynamic_offset = dynamic_offset, - .count = size_shift == DESCRIPTOR_SIZE_SHIFT ? DEFAULT_DYNAMIC_DESCRIPTOR_COUNT - : MAX_DYNAMIC_DESCRIPTOR_COUNT, + .count = DynamicDescriptorCount(base_offset, size_shift), .has_secondary = false, }; }