diff options
| author | Sssnowyyy <78863999+Sssnowyyy@users.noreply.github.com> | 2026-11-02 11:19:46 -0500 |
|---|---|---|
| committer | Sssnowyyy <78863999+Sssnowyyy@users.noreply.github.com> | 2026-11-02 14:53:47 -0500 |
| commit | c83eb1d1f5c14d0842a165de431ac6367dff2909 (patch) | |
| tree | 2dafb5a896fb968b9baee2875837a7ca5ee12736 /src | |
| parent | c5fb2d2a1dd3b47e6d7b4f6acf2bdfae325e2918 (diff) | |
shader: tell handle-program textures apart when adding descriptors
Every texture whose handle is computed per draw gets the same placeholder
constant buffer address (index 0, offset 0), and Descriptors::Add did not
compare handle_program. Two such textures of the same type and depth in one
shader therefore shared a descriptor, so the second sampled the first, and one
could also merge with a real texture bound at constant buffer 0 offset 0.
Compare handle_program too.
The pixel-format-integer lookup cached its last answer by (index, offset), which
has the same problem for handle programs; skip that cache for them.
Follow-up to 561f87abec.
Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
Diffstat (limited to 'src')
| -rw-r--r-- | src/shader_recompiler/ir_opt/texture_pass.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index 8a72f565dc..514cd9b2b6 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp @@ -1036,7 +1036,8 @@ public: desc.secondary_cbuf_index == existing.secondary_cbuf_index && desc.secondary_cbuf_offset == existing.secondary_cbuf_offset && desc.secondary_shift_left == existing.secondary_shift_left && - desc.count == existing.count && desc.size_shift == existing.size_shift; + desc.count == existing.count && desc.size_shift == existing.size_shift && + desc.handle_program == existing.handle_program; })}; // TODO: Read this from TIC texture_descriptors[index].is_multisample |= desc.is_multisample; @@ -1171,6 +1172,10 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo u32 last_cbuf_offset{}; bool last_is_integer{false}; const auto is_texture_pixel_format_integer{[&](const ConstBufferAddr& cbuf_addr) { + if (cbuf_addr.handle_program != ~0U) { + // Every handle program is at cbuf 0 offset 0: the cache below can't tell them apart. + return IsTexturePixelFormatIntegerCached(env, cbuf_addr); + } if (has_last_is_integer && last_cbuf_index == cbuf_addr.index && last_cbuf_offset == cbuf_addr.offset) { return last_is_integer; |
