diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.c b/src/gallium/auxiliary/nir/nir_to_tgsi.c index 4d161d4871d..451147c5c7e 100644 --- a/src/gallium/auxiliary/nir/nir_to_tgsi.c +++ b/src/gallium/auxiliary/nir/nir_to_tgsi.c @@ -1176,21 +1176,28 @@ ntt_get_load_const_src(struct ntt_compile *c, nir_load_const_instr *instr) return ureg_DECL_immediate(c->ureg, values, num_components); } else { - uint32_t values[4]; - if (instr->def.bit_size == 32) { + uint32_t values[4]; for (int i = 0; i < num_components; i++) values[i] = instr->value[i].u32; + return ureg_DECL_immediate_uint(c->ureg, values, num_components); + } else if (c->options->keep_double_immediates && instr->def.bit_size == 64) { + uint64_t values[2]; + assert(num_components <= 2); + for (int i = 0; i < num_components; i++) + values[i] = instr->value[i].u64; + num_components *= 2; + return ureg_DECL_immediate_uint64(c->ureg, values, num_components); } else { + uint32_t values[4]; assert(num_components <= 2); for (int i = 0; i < num_components; i++) { values[i * 2 + 0] = instr->value[i].u64 & 0xffffffff; values[i * 2 + 1] = instr->value[i].u64 >> 32; } num_components *= 2; + return ureg_DECL_immediate_uint(c->ureg, values, num_components); } - - return ureg_DECL_immediate_uint(c->ureg, values, num_components); } } diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.h b/src/gallium/auxiliary/nir/nir_to_tgsi.h index 48c668555e0..f8dfdea3eb8 100644 --- a/src/gallium/auxiliary/nir/nir_to_tgsi.h +++ b/src/gallium/auxiliary/nir/nir_to_tgsi.h @@ -38,6 +38,7 @@ struct nir_to_tgsi_options { bool unoptimized_ra; bool lower_ssbo_bindings; bool non_compute_membar_needs_all_modes; + bool keep_double_immediates; uint32_t ubo_vec4_max; }; diff --git a/src/gallium/drivers/svga/svga_shader.c b/src/gallium/drivers/svga/svga_shader.c index c1c9205746d..87239c45b2a 100644 --- a/src/gallium/drivers/svga/svga_shader.c +++ b/src/gallium/drivers/svga/svga_shader.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2024 Broadcom. All Rights Reserved. + * Copyright (c) 2008-2025 Broadcom. All Rights Reserved. * The term “Broadcom” refers to Broadcom Inc. * and/or its subsidiaries. * SPDX-License-Identifier: MIT @@ -929,10 +929,15 @@ svga_create_shader(struct pipe_context *pipe, shader->stage = stage; if (templ->type == PIPE_SHADER_IR_NIR) { + const struct nir_to_tgsi_options ntt_options = { + .keep_double_immediates = true, + }; /* nir_to_tgsi requires lowered images */ NIR_PASS_V(nir, gl_nir_lower_images, false); + shader->tokens = nir_to_tgsi_options(nir, pipe->screen, &ntt_options); + } else { + shader->tokens = pipe_shader_state_to_tgsi_tokens(pipe->screen, templ); } - shader->tokens = pipe_shader_state_to_tgsi_tokens(pipe->screen, templ); shader->type = PIPE_SHADER_IR_TGSI; /* Collect basic info of the shader */