diff --git a/.pick_status.json b/.pick_status.json index 3d605be27db..83cfa0a68e5 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1408,7 +1408,7 @@ "description": "nir: Add lowering for fround_even on r300.", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "7d2ea9b0edef2176140629ac3dee6a6809c4abe2" }, diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 45ca5789825..29ed6820f3f 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3286,6 +3286,14 @@ typedef struct nir_shader_compiler_options { bool lower_ftrunc; + /** Lowers fround_even to ffract+feq+csel. + * + * Not correct in that it doesn't correctly handle the "_even" part of the + * rounding, but good enough for DX9 array indexing handling on DX9-class + * hardware. + */ + bool lower_fround_even; + bool lower_ldexp; bool lower_pack_half_2x16; diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 54be7f7195d..35f445afd5e 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -356,6 +356,14 @@ optimizations.extend([ (('~flrp', a, 0.0, c), ('fadd', ('fmul', ('fneg', a), c), a)), (('ftrunc', a), ('bcsel', ('flt', a, 0.0), ('fneg', ('ffloor', ('fabs', a))), ('ffloor', ('fabs', a))), 'options->lower_ftrunc'), + + # Approximate handling of fround_even for DX9 addressing from gallium nine on + # DX9-class hardware with no proper fround support. + (('fround_even', a), ('bcsel', + ('feq', ('ffract', a), 0.5), + ('fadd', ('ffloor', ('fadd', a, 0.5)), 1.0), + ('ffloor', ('fadd', a, 0.5))), 'options->lower_fround_even'), + (('ffloor', a), ('fsub', a, ('ffract', a)), 'options->lower_ffloor'), (('fadd', a, ('fneg', ('ffract', a))), ('ffloor', a), '!options->lower_ffloor'), (('ffract', a), ('fsub', a, ('ffloor', a)), 'options->lower_ffract'), diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index 40f5e5c0a5a..64d9135d54b 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c @@ -514,6 +514,7 @@ static const nir_shader_compiler_options r500_vs_compiler_options = { .lower_flrp32 = true, .lower_flrp64 = true, .lower_fmod = true, + .lower_fround_even = true, .lower_rotate = true, .lower_uniforms_to_ubo = true, .lower_vector_cmp = true, @@ -541,6 +542,7 @@ static const nir_shader_compiler_options r500_fs_compiler_options = { .lower_flrp32 = true, .lower_flrp64 = true, .lower_fmod = true, + .lower_fround_even = true, .lower_rotate = true, .lower_uniforms_to_ubo = true, .lower_vector_cmp = true, @@ -568,6 +570,7 @@ static const nir_shader_compiler_options r300_vs_compiler_options = { .lower_flrp32 = true, .lower_flrp64 = true, .lower_fmod = true, + .lower_fround_even = true, .lower_rotate = true, .lower_uniforms_to_ubo = true, .lower_vector_cmp = true, @@ -594,6 +597,7 @@ static const nir_shader_compiler_options r300_fs_compiler_options = { .lower_flrp32 = true, .lower_flrp64 = true, .lower_fmod = true, + .lower_fround_even = true, .lower_rotate = true, .lower_uniforms_to_ubo = true, .lower_vector_cmp = true,