On Mon, 2016-12-12 at 23:14 -0800, Kenneth Graunke wrote: > On Monday, December 12, 2016 2:11:43 PM PST Iago Toral Quiroga wrote: > > > > This is ported from the Intel lowering pass that we use with GLSL > > IR. > > The NIR pass only handles cube maps, not shadow samplers, which are > > also lowered for gen < 8 on Intel hardware. We will add support for > > that in a later patch, at which point we should be able to remove > > the GLSL IR lowering pass. > > > > v2: > > - added a helper to retrieve ddx/ddy parameters (Ken) > > - No need to make size.z=1.0, we are only using component x anyway > > (Iago) > > --- > > src/compiler/nir/nir.h | 5 + > > src/compiler/nir/nir_lower_tex.c | 265 > > +++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 270 insertions(+) > > > > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h > > index 544d4ba..600e3d6 100644 > > --- a/src/compiler/nir/nir.h > > +++ b/src/compiler/nir/nir.h > > @@ -2394,6 +2394,11 @@ typedef struct nir_lower_tex_options { > > * of the texture are lowered to linear. > > */ > > unsigned lower_srgb; > > + > > + /** > > + * If true, lower nir_texop_txd on cube maps with > > nir_texop_txl. > > + */ > > + bool lower_txd_cube_map; > > } 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 ccca59b..da024e2 100644 > > --- a/src/compiler/nir/nir_lower_tex.c > > +++ b/src/compiler/nir/nir_lower_tex.c > > @@ -305,6 +305,265 @@ lower_yx_xuxv_external(nir_builder *b, > > nir_tex_instr *tex) > > } > > > > static void > > +get_ddx_ddy(nir_tex_instr *tex, nir_ssa_def **ddx, nir_ssa_def > > **ddy) > > +{ > > + for (int i = 0; i < tex->num_srcs; i++) { > > + switch (tex->src[i].src_type) { > > + case nir_tex_src_ddx: > > + *ddx = tex->src[i].src.ssa; > > + break; > > + case nir_tex_src_ddy: > > + *ddy = tex->src[i].src.ssa; > > + break; > > + default: > > + break; > > + } > > + } > > +} > > + > > +/* > > + * Emits a textureLod operation used to replace an existing > > + * textureGrad instruction. > > + */ > > +static void > > +replace_gradient_with_lod(nir_builder *b, nir_ssa_def *lod, > > nir_tex_instr *tex) > > +{ > > + /* Check whether we need projector, shadow comparitor or offset > > */ > > + int comparitor_index = -1; > > + int projector_index = -1; > > + int offset_index = -1; > > + int extra_srcs = 0; > > + for (int i = 0; i < tex->num_srcs; i++) { > > + switch (tex->src[i].src_type) { > > + case nir_tex_src_projector: > > + projector_index = i; > > + extra_srcs++; > > + break; > > + case nir_tex_src_offset: > > + offset_index = i; > > + extra_srcs++; > > + break; > > + case nir_tex_src_comparitor: > > + comparitor_index = i; > > + extra_srcs++; > > + break; > > + default: > > + break; > > + } > > + } > This looks correct now, but I liked Eric's suggestion from last time > - > you can actually just do: > > int comparitor_idx = nir_tex_instr_src_index(tex, > nir_tex_src_comparitor); > int projector_idx = nir_tex_instr_src_index(tex, > nir_tex_src_projector); > int offset_idx = nir_tex_instr_src_index(tex, nir_tex_src_offset); > > /* we replace ddx and ddy with a single value: lod */ > int num_srcs = tex->num_srcs - 1; > > nir_ssa_def *dPdx = > tex->src[nir_tex_src_index(tex, nir_tex_src_ddx)].src.ssa; > nir_ssa_def *dPdy = > tex->src[nir_tex_src_index(tex, nir_tex_src_ddy)].src.ssa; > > Either way, this series is: > Reviewed-by: Kenneth Graunke <kenn...@whitecape.org>
Ah, I had missed that suggestion, that's much better. I'll fix it up and push the series. Thanks for the review! Iago > I don't need to see a third posting - feel free to fix up any last > things before pushing. Thanks for doing this! _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev