Kenneth Graunke <kenn...@whitecape.org> writes: > [ Unknown signature status ] > On Thursday, December 1, 2016 8:53:19 AM PST Iago Toral Quiroga wrote: >> This is ported from the Intel lowering pass that we use with GLSL IR. >> This takes care of lowering texture gradients on shadow samplers other >> than cube maps. Intel hardware requires this for gen < 8. >> --- >> src/compiler/nir/nir.h | 7 +++++++ >> src/compiler/nir/nir_lower_tex.c | 40 >> ++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 47 insertions(+) >> >> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h >> index ed388c6..d494d5f 100644 >> --- a/src/compiler/nir/nir.h >> +++ b/src/compiler/nir/nir.h >> @@ -2437,6 +2437,13 @@ typedef struct nir_lower_tex_options { >> * If true, lower nir_texop_txd on cube maps with nir_texop_txl. >> */ >> bool lower_txd_cube_map; >> + >> + /** >> + * If true, lower nir_texop_txd on shadow samplers (except cube maps) >> + * with nir_texop_txl. Notice that cube map shadow samplers are lowered >> + * with lower_txd_cube_map. >> + */ >> + bool lower_txd_shadow; >> } nir_lower_tex_options; >> >> bool nir_lower_tex(nir_shader *shader, >> diff --git a/src/compiler/nir/nir_lower_tex.c >> b/src/compiler/nir/nir_lower_tex.c >> index c7c3db2..d5ea509 100644 >> --- a/src/compiler/nir/nir_lower_tex.c >> +++ b/src/compiler/nir/nir_lower_tex.c >> @@ -556,6 +556,40 @@ lower_gradient_cube_map(nir_builder *b, nir_tex_instr >> *tex) >> } >> >> static void >> +lower_gradient_shadow(nir_builder *b, nir_tex_instr *tex) >> +{ >> + assert(tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE); >> + assert(tex->is_shadow); >> + assert(tex->op == nir_texop_txd); >> + assert(tex->dest.is_ssa); >> + >> + /* Use textureSize() to get the width and height of LOD 0 */ >> + nir_ssa_def *size = get_texture_size(b, tex); >> + >> + /* Scale the gradients by width and height. Effectively, the incoming >> + * gradients are s'(x,y), t'(x,y), and r'(x,y) from equation 3.19 in the >> + * GL 3.0 spec; we want u'(x,y), which is w_t * s'(x,y). >> + */ >> + nir_ssa_def *dPdx = nir_fmul(b, tex->src[2].src.ssa, size); >> + nir_ssa_def *dPdy = nir_fmul(b, tex->src[3].src.ssa, size); > > NIR texture sources aren't guaranteed to be in any particular order > (it's kind of annoying)...you should instead do: > > nir_ssa_def *dPdx; > nir_ssa_def *dPdy; > > for (unsigned i = 0; i < tex->num_srcs; i++) { > switch (tex->src[i].src_type) { > case nir_tex_src_ddx: > dPdx = nir_fmul(b, tex->src[i].src.ssa, size); > break; > case nir_tex_src_ddy: > dPdy = nir_fmul(b, tex->src[i].src.ssa, size); > break; > default: > break; > } > } > > Same comment on patch two. Maybe make a get_ddx_ddy() helper?
nir_tex_instr_src_index() helps with this.
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev