diff options
author | Jason Ekstrand <[email protected]> | 2019-02-08 17:51:24 -0600 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-03-04 23:56:39 +0000 |
commit | 5c96120b5ce158fea28d751d8a55b5e4d80df4f3 (patch) | |
tree | eef1bc4ec634ceb27c6691cc08737181580941f6 /src/compiler/nir/nir_lower_tex.c | |
parent | ca295ddbfb414a526d3bab7daf93fffbbc417c6e (diff) |
intel,nir: Lower TXD with min_lod when the sampler index is not < 16
When we have a larger sampler index, we get into the "high sampler"
scenario and need an instruction header. Even in SIMD8, this pushes the
instruction over the sampler message size maximum of 11 registers.
Instead, we have to lower TXD to TXL.
Fixes: cb98e0755f8d "intel/fs: Support min_lod parameters on texture..."
Reviewed-by: Lionel Landwerlin <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir_lower_tex.c')
-rw-r--r-- | src/compiler/nir/nir_lower_tex.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_lower_tex.c b/src/compiler/nir/nir_lower_tex.c index 7c6eafed2f9..903b975d6c3 100644 --- a/src/compiler/nir/nir_lower_tex.c +++ b/src/compiler/nir/nir_lower_tex.c @@ -906,6 +906,25 @@ lower_tex_packing(nir_builder *b, nir_tex_instr *tex, } static bool +sampler_index_lt(nir_tex_instr *tex, unsigned max) +{ + assert(nir_tex_instr_src_index(tex, nir_tex_src_sampler_deref) == -1); + + unsigned sampler_index = tex->sampler_index; + + int sampler_offset_idx = + nir_tex_instr_src_index(tex, nir_tex_src_sampler_offset); + if (sampler_offset_idx >= 0) { + if (!nir_src_is_const(tex->src[sampler_offset_idx].src)) + return false; + + sampler_index += nir_src_as_uint(tex->src[sampler_offset_idx].src); + } + + return sampler_index < max; +} + +static bool nir_lower_tex_block(nir_block *block, nir_builder *b, const nir_lower_tex_options *options) { @@ -1026,6 +1045,8 @@ nir_lower_tex_block(nir_block *block, nir_builder *b, (options->lower_txd_shadow && tex->is_shadow) || (options->lower_txd_shadow_clamp && tex->is_shadow && has_min_lod) || (options->lower_txd_offset_clamp && has_offset && has_min_lod) || + (options->lower_txd_clamp_if_sampler_index_not_lt_16 && + has_min_lod && !sampler_index_lt(tex, 16)) || (options->lower_txd_cube_map && tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE) || (options->lower_txd_3d && |