diff --git a/.pick_status.json b/.pick_status.json index 6d3d3b527fa..ae2f66270e9 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -374,7 +374,7 @@ "description": "ac/nir: fix computing cube derivatives when the major axis is negative", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/ci/radv-fails.txt b/src/amd/ci/radv-fails.txt index c6b571b2c0d..e69de29bb2d 100644 --- a/src/amd/ci/radv-fails.txt +++ b/src/amd/ci/radv-fails.txt @@ -1,2 +0,0 @@ -# RADV bug -dEQP-VK.texture.mipmap.cubemap.misc.projected_derivatives,Fail diff --git a/src/amd/common/nir/ac_nir_lower_tex.c b/src/amd/common/nir/ac_nir_lower_tex.c index 1ff4fd8d93d..45b3ce89fd9 100644 --- a/src/amd/common/nir/ac_nir_lower_tex.c +++ b/src/amd/common/nir/ac_nir_lower_tex.c @@ -47,8 +47,11 @@ build_cube_select(nir_builder *b, nir_def *ma, nir_def *id, nir_def *deriv, nir_bcsel(b, is_ma_positive, nir_imm_float(b, 1.0), nir_imm_float(b, -1.0)); nir_def *neg_sgn_ma = nir_fneg(b, sgn_ma); - nir_def *is_ma_z = nir_fge_imm(b, id, 4.0); - nir_def *is_ma_y = nir_fge_imm(b, id, 2.0); + nir_def *face_id_half = nir_fmul_imm(b, id, 0.5); + nir_def *face_id_pos = nir_ftrunc(b, face_id_half); + nir_def *face_neg = nir_fneu(b, face_id_pos, face_id_half); + nir_def *is_ma_z = nir_fge_imm(b, face_id_pos, 2.0); + nir_def *is_ma_y = nir_fge_imm(b, face_id_pos, 1.0); is_ma_y = nir_iand(b, is_ma_y, nir_inot(b, is_ma_z)); nir_def *is_not_ma_x = nir_ior(b, is_ma_z, is_ma_y); @@ -65,7 +68,10 @@ build_cube_select(nir_builder *b, nir_def *ma, nir_def *id, nir_def *deriv, /* Select ma */ tmp = nir_bcsel(b, is_ma_z, deriv_z, nir_bcsel(b, is_ma_y, deriv_y, deriv_x)); - *out_ma = nir_fmul_imm(b, nir_fabs(b, tmp), 2.0); + sgn = nir_bcsel(b, face_neg, nir_imm_float(b, -1.0), sgn_ma); + *out_ma = nir_fmul(b, tmp, sgn); + + *out_ma = nir_fmul_imm(b, *out_ma, 2.0); } static void