diff --git a/.pick_status.json b/.pick_status.json index c2b478db878..09ed585578f 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -256,7 +256,7 @@ "description": "ac/nir: fix 8-bit/10-bit PS exports clamping", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "c182154456288dbab23e87dbc5fc1962984caa92" }, diff --git a/src/amd/common/ac_nir_lower_ps.c b/src/amd/common/ac_nir_lower_ps.c index 8b0c533b0da..e0b186cdae8 100644 --- a/src/amd/common/ac_nir_lower_ps.c +++ b/src/amd/common/ac_nir_lower_ps.c @@ -326,7 +326,6 @@ emit_ps_color_export(nir_builder *b, lower_ps_state *s, gl_frag_result slot, uns default: { nir_op pack_op = nir_op_pack_32_2x16; - bool need_clamp = false; switch (spi_shader_col_format) { case V_028714_SPI_SHADER_FP16_ABGR: @@ -336,13 +335,39 @@ emit_ps_color_export(nir_builder *b, lower_ps_state *s, gl_frag_result slot, uns case V_028714_SPI_SHADER_UINT16_ABGR: if (type_size == 32) { pack_op = nir_op_pack_uint_2x16; - need_clamp = is_int8 || is_int10; + if (is_int8 || is_int10) { + /* clamp 32bit output for 8/10 bit color component */ + uint32_t max_rgb = is_int8 ? 255 : 1023; + + for (int i = 0; i < 4; i++) { + if (!data[i]) + continue; + + uint32_t max_value = i == 3 && is_int10 ? 3 : max_rgb; + data[i] = nir_umin(b, data[i], nir_imm_int(b, max_value)); + } + } } break; case V_028714_SPI_SHADER_SINT16_ABGR: if (type_size == 32) { pack_op = nir_op_pack_sint_2x16; - need_clamp = is_int8 || is_int10; + if (is_int8 || is_int10) { + /* clamp 32bit output for 8/10 bit color component */ + uint32_t max_rgb = is_int8 ? 127 : 511; + uint32_t min_rgb = is_int8 ? -128 : -512; + + for (int i = 0; i < 4; i++) { + if (!data[i]) + continue; + + uint32_t max_value = i == 3 && is_int10 ? 1 : max_rgb; + uint32_t min_value = i == 3 && is_int10 ? -2u : min_rgb; + + data[i] = nir_imin(b, data[i], nir_imm_int(b, max_value)); + data[i] = nir_imax(b, data[i], nir_imm_int(b, min_value)); + } + } } break; case V_028714_SPI_SHADER_UNORM16_ABGR: @@ -356,14 +381,6 @@ emit_ps_color_export(nir_builder *b, lower_ps_state *s, gl_frag_result slot, uns break; } - /* clamp 32bit output for 8/10 bit color component */ - for (int i = 0; i < 4; i++) { - if (need_clamp && data[i]) { - int max_value = is_int10 ? (i == 3 ? 3 : 1023) : 255; - data[i] = nir_umin(b, data[i], nir_imm_int(b, max_value)); - } - } - for (int i = 0; i < 2; i++) { nir_ssa_def *lo = data[i * 2]; nir_ssa_def *hi = data[i * 2 + 1];