diff --git a/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp b/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp index e8ca9667fac..d4306486c86 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp @@ -22,15 +22,36 @@ r600_legalize_image_load_store_impl(nir_builder *b, b->cursor = nir_before_instr(instr); auto ir = nir_instr_as_intrinsic(instr); - nir_def *default_value = nir_imm_vec4(b, 0.0, 0.0, 0.0, 0.0); + nir_def *default_value, *zero_value; nir_def *result = NIR_LOWER_INSTR_PROGRESS_REPLACE; bool load_value = ir->intrinsic != nir_intrinsic_image_store; - if (load_value) - default_value = - nir_imm_zero(b, ir->def.num_components, ir->def.bit_size); + if (load_value) { + const enum pipe_format format = nir_intrinsic_format(ir); + + zero_value = nir_imm_zero(b, ir->def.num_components, ir->def.bit_size); + + if (ir->def.num_components == 4 && !util_format_has_alpha(format)) { + const nir_alu_type type = + nir_alu_type_get_base_type(nir_intrinsic_dest_type(ir)); + + switch (type) { + case nir_type_int: + case nir_type_uint: + default_value = nir_imm_ivec4_intN(b, 0, 0, 0, 1, ir->def.bit_size); + break; + case nir_type_float: + default: + default_value = nir_imm_vec4(b, 0.0, 0.0, 0.0, 1.0); + } + } else { + default_value = zero_value; + } + } else { + default_value = zero_value = nir_imm_vec4(b, 0.0, 0.0, 0.0, 0.0); + } auto image_exists = nir_ult_imm(b, ir->src[0].ssa, b->shader->info.num_images); @@ -140,7 +161,7 @@ r600_legalize_image_load_store_impl(nir_builder *b, nir_pop_if(b, else_exists); if (load_value) - result = nir_if_phi(b, result, default_value); + result = nir_if_phi(b, result, zero_value); { nir_cf_list cf_list;