diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c index 860f9c36f3c..765bb51ec77 100644 --- a/src/gallium/drivers/iris/iris_program.c +++ b/src/gallium/drivers/iris/iris_program.c @@ -532,13 +532,18 @@ iris_setup_uniforms(ASSERTED const struct intel_device_info *devinfo, unsigned max_offset = b.shader->constant_data_size - load_size; offset = nir_umin(&b, offset, nir_imm_int(&b, max_offset)); - nir_ssa_def *const_data_base_addr = nir_pack_64_2x32_split(&b, - nir_load_reloc_const_intel(&b, BRW_SHADER_RELOC_CONST_DATA_ADDR_LOW), - nir_load_reloc_const_intel(&b, BRW_SHADER_RELOC_CONST_DATA_ADDR_HIGH)); + /* Constant data lives in buffers within IRIS_MEMZONE_SHADER + * and cannot cross that 4GB boundary, so we can do the address + * calculation with 32-bit adds. Also, we can ignore the high + * bits because IRIS_MEMZONE_SHADER is in the [0, 4GB) range. + */ + assert(IRIS_MEMZONE_SHADER_START >> 32 == 0ull); + + nir_ssa_def *const_data_addr = + nir_iadd(&b, nir_load_reloc_const_intel(&b, BRW_SHADER_RELOC_CONST_DATA_ADDR_LOW), offset); nir_ssa_def *data = - nir_load_global_constant(&b, nir_iadd(&b, const_data_base_addr, - nir_u2u64(&b, offset)), + nir_load_global_constant(&b, nir_u2u64(&b, const_data_addr), load_align, intrin->dest.ssa.num_components, intrin->dest.ssa.bit_size);