Module: Mesa
Branch: main
Commit: bcf0425f7ffc2dbafdf3e660c976a8c27b3514e2
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=bcf0425f7ffc2dbafdf3e660c976a8c27b3514e2

Author: Job Noorman <[email protected]>
Date:   Tue Nov 14 15:59:34 2023 +0100

ir3: correctly set bit size for 64b constant @load_ubo

When lowering @load_constant to @load_ubo, the bit size is currently
hard-coded to 32. This causes validation errors when lowering a constant
with a 64b bit size.

This patch fixes this by setting the @load_ubo bit size correctly for
64b constants. This 64b load is later lowered to a 32b load by
ir3_nir_lower_64b_intrinsics.

Fixes Piglit test:
- spec@arb_gpu_shader_fp64@execution@fs-indirect-temp-double-src

This patch has no impact on shader-db.

Signed-off-by: Job Noorman <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26191>

---

 src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c 
b/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c
index 85719e8024c..b2a849666dd 100644
--- a/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c
+++ b/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c
@@ -594,6 +594,7 @@ ir3_nir_lower_load_const_instr(nir_builder *b, nir_instr 
*in_instr, void *data)
    }
 
    unsigned num_components = instr->num_components;
+   unsigned bit_size = instr->def.bit_size;
    if (instr->def.bit_size == 16) {
       /* We can't do 16b loads -- either from LDC (32-bit only in any of our
        * traces, and disasm that doesn't look like it really supports it) or
@@ -602,6 +603,7 @@ ir3_nir_lower_load_const_instr(nir_builder *b, nir_instr 
*in_instr, void *data)
        * Instead, we'll load 32b from a UBO and unpack from there.
        */
       num_components = DIV_ROUND_UP(num_components, 2);
+      bit_size = 32;
    }
    unsigned base = nir_intrinsic_base(instr);
    nir_def *index = nir_imm_int(b, const_state->constant_data_ubo);
@@ -609,7 +611,7 @@ ir3_nir_lower_load_const_instr(nir_builder *b, nir_instr 
*in_instr, void *data)
       nir_iadd_imm(b, instr->src[0].ssa, base);
 
    nir_def *result =
-      nir_load_ubo(b, num_components, 32, index, offset,
+      nir_load_ubo(b, num_components, bit_size, index, offset,
                    .align_mul = nir_intrinsic_align_mul(instr),
                    .align_offset = nir_intrinsic_align_offset(instr),
                    .range_base = base, .range = nir_intrinsic_range(instr));

Reply via email to