On Tue, Jul 26, 2016 at 03:02:18PM -0700, Jason Ekstrand wrote: > Multisample array surfaces on IVB don't support the minimum array element > surface attribute so it needs to come through the sampler message. We may > as well just pass it through everything. > --- > src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 77 > +++++++++++++--------------- > 1 file changed, 35 insertions(+), 42 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp > b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp > index fb81a22..a76d130 100644 > --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp > +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp > @@ -432,11 +432,11 @@ blorp_nir_discard_if_outside_rect(nir_builder *b, > nir_ssa_def *pos, > } > > static nir_tex_instr * > -blorp_create_nir_tex_instr(nir_shader *shader, nir_texop op, > - nir_ssa_def *pos, unsigned num_srcs, > +blorp_create_nir_tex_instr(nir_builder *b, struct brw_blorp_blit_vars *v, > + nir_texop op, nir_ssa_def *pos, unsigned num_srcs, > enum brw_reg_type dst_type) > { > - nir_tex_instr *tex = nir_tex_instr_create(shader, num_srcs); > + nir_tex_instr *tex = nir_tex_instr_create(b->shader, num_srcs); > > tex->op = op; > > @@ -463,22 +463,32 @@ blorp_create_nir_tex_instr(nir_shader *shader, > nir_texop op, > tex->texture_index = 0; > tex->sampler_index = 0; > > + /* To properly handle 3-D and 2-D array textures, we pull the Z component > + * from a uniform. TODO: This is a bit magic; we should probably make > this
This is really something I overlooked when I switched from uniforms to flat inputs. If you like you could update the comment to talk about flat vertex input. Anyway, looks good: Reviewed-by: Topi Pohjolainen <topi.pohjolai...@intel.com> > + * more explicit in the future. > + */ > + assert(pos->num_components >= 2); > + pos = nir_vec3(b, nir_channel(b, pos, 0), nir_channel(b, pos, 1), > + nir_load_var(b, v->v_src_z)); > + > + tex->src[0].src_type = nir_tex_src_coord; > + tex->src[0].src = nir_src_for_ssa(pos); > + tex->coord_components = 3; > + > nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, NULL); > > return tex; > } > > static nir_ssa_def * > -blorp_nir_tex(nir_builder *b, nir_ssa_def *pos, enum brw_reg_type dst_type) > +blorp_nir_tex(nir_builder *b, struct brw_blorp_blit_vars *v, > + nir_ssa_def *pos, enum brw_reg_type dst_type) > { > nir_tex_instr *tex = > - blorp_create_nir_tex_instr(b->shader, nir_texop_tex, pos, 2, dst_type); > + blorp_create_nir_tex_instr(b, v, nir_texop_tex, pos, 2, dst_type); > > assert(pos->num_components == 2); > tex->sampler_dim = GLSL_SAMPLER_DIM_2D; > - tex->coord_components = 2; > - tex->src[0].src_type = nir_tex_src_coord; > - tex->src[0].src = nir_src_for_ssa(pos); > tex->src[1].src_type = nir_tex_src_lod; > tex->src[1].src = nir_src_for_ssa(nir_imm_int(b, 0)); > > @@ -492,20 +502,9 @@ blorp_nir_txf(nir_builder *b, struct brw_blorp_blit_vars > *v, > nir_ssa_def *pos, enum brw_reg_type dst_type) > { > nir_tex_instr *tex = > - blorp_create_nir_tex_instr(b->shader, nir_texop_txf, pos, 2, dst_type); > - > - /* In order to properly handle 3-D textures, we pull the Z component from > - * a uniform. TODO: This is a bit magic; we should probably make this > - * more explicit in the future. > - */ > - assert(pos->num_components == 2); > - pos = nir_vec3(b, nir_channel(b, pos, 0), nir_channel(b, pos, 1), > - nir_load_var(b, v->v_src_z)); > + blorp_create_nir_tex_instr(b, v, nir_texop_txf, pos, 2, dst_type); > > tex->sampler_dim = GLSL_SAMPLER_DIM_3D; > - tex->coord_components = 3; > - tex->src[0].src_type = nir_tex_src_coord; > - tex->src[0].src = nir_src_for_ssa(pos); > tex->src[1].src_type = nir_tex_src_lod; > tex->src[1].src = nir_src_for_ssa(nir_imm_int(b, 0)); > > @@ -515,17 +514,14 @@ blorp_nir_txf(nir_builder *b, struct > brw_blorp_blit_vars *v, > } > > static nir_ssa_def * > -blorp_nir_txf_ms(nir_builder *b, nir_ssa_def *pos, nir_ssa_def *mcs, > - enum brw_reg_type dst_type) > +blorp_nir_txf_ms(nir_builder *b, struct brw_blorp_blit_vars *v, > + nir_ssa_def *pos, nir_ssa_def *mcs, enum brw_reg_type > dst_type) > { > nir_tex_instr *tex = > - blorp_create_nir_tex_instr(b->shader, nir_texop_txf_ms, pos, > + blorp_create_nir_tex_instr(b, v, nir_texop_txf_ms, pos, > mcs != NULL ? 3 : 2, dst_type); > > tex->sampler_dim = GLSL_SAMPLER_DIM_MS; > - tex->coord_components = 2; > - tex->src[0].src_type = nir_tex_src_coord; > - tex->src[0].src = nir_src_for_ssa(pos); > > tex->src[1].src_type = nir_tex_src_ms_index; > if (pos->num_components == 2) { > @@ -546,16 +542,13 @@ blorp_nir_txf_ms(nir_builder *b, nir_ssa_def *pos, > nir_ssa_def *mcs, > } > > static nir_ssa_def * > -blorp_nir_txf_ms_mcs(nir_builder *b, nir_ssa_def *pos) > +blorp_nir_txf_ms_mcs(nir_builder *b, struct brw_blorp_blit_vars *v, > nir_ssa_def *pos) > { > nir_tex_instr *tex = > - blorp_create_nir_tex_instr(b->shader, nir_texop_txf_ms_mcs, > + blorp_create_nir_tex_instr(b, v, nir_texop_txf_ms_mcs, > pos, 1, BRW_REGISTER_TYPE_D); > > tex->sampler_dim = GLSL_SAMPLER_DIM_MS; > - tex->coord_components = 2; > - tex->src[0].src_type = nir_tex_src_coord; > - tex->src[0].src = nir_src_for_ssa(pos); > > nir_builder_instr_insert(b, &tex->instr); > > @@ -889,8 +882,8 @@ static inline int count_trailing_one_bits(unsigned value) > } > > static nir_ssa_def * > -blorp_nir_manual_blend_average(nir_builder *b, nir_ssa_def *pos, > - unsigned tex_samples, > +blorp_nir_manual_blend_average(nir_builder *b, struct brw_blorp_blit_vars *v, > + nir_ssa_def *pos, unsigned tex_samples, > enum isl_aux_usage tex_aux_usage, > enum brw_reg_type dst_type) > { > @@ -902,7 +895,7 @@ blorp_nir_manual_blend_average(nir_builder *b, > nir_ssa_def *pos, > > nir_ssa_def *mcs = NULL; > if (tex_aux_usage == ISL_AUX_USAGE_MCS) > - mcs = blorp_nir_txf_ms_mcs(b, pos); > + mcs = blorp_nir_txf_ms_mcs(b, v, pos); > > /* We add together samples using a binary tree structure, e.g. for 4x > MSAA: > * > @@ -944,7 +937,7 @@ blorp_nir_manual_blend_average(nir_builder *b, > nir_ssa_def *pos, > nir_ssa_def *ms_pos = nir_vec3(b, nir_channel(b, pos, 0), > nir_channel(b, pos, 1), > nir_imm_int(b, i)); > - texture_data[stack_depth++] = blorp_nir_txf_ms(b, ms_pos, mcs, > dst_type); > + texture_data[stack_depth++] = blorp_nir_txf_ms(b, v, ms_pos, mcs, > dst_type); > > if (i == 0 && tex_aux_usage == ISL_AUX_USAGE_MCS) { > /* The Ivy Bridge PRM, Vol4 Part1 p27 (Multisample Control Surface) > @@ -1064,7 +1057,7 @@ blorp_nir_manual_blend_bilinear(nir_builder *b, > nir_ssa_def *pos, > */ > nir_ssa_def *mcs = NULL; > if (key->tex_aux_usage == ISL_AUX_USAGE_MCS) > - mcs = blorp_nir_txf_ms_mcs(b, sample_coords_int); > + mcs = blorp_nir_txf_ms_mcs(b, v, sample_coords_int); > > /* Compute sample index and map the sample index to a sample number. > * Sample index layout shows the numbering of slots in a rectangular > @@ -1136,7 +1129,7 @@ blorp_nir_manual_blend_bilinear(nir_builder *b, > nir_ssa_def *pos, > nir_ssa_def *pos_ms = nir_vec3(b, nir_channel(b, sample_coords_int, 0), > nir_channel(b, sample_coords_int, 1), > sample); > - tex_data[i] = blorp_nir_txf_ms(b, pos_ms, mcs, key->texture_data_type); > + tex_data[i] = blorp_nir_txf_ms(b, v, pos_ms, mcs, > key->texture_data_type); > } > > nir_ssa_def *frac_x = nir_channel(b, frac_xy, 0); > @@ -1418,10 +1411,10 @@ brw_blorp_build_nir_shader(struct brw_context *brw, > src_pos = nir_ishl(&b, src_pos, nir_imm_int(&b, 1)); > src_pos = nir_iadd(&b, src_pos, nir_imm_int(&b, 1)); > src_pos = nir_i2f(&b, src_pos); > - color = blorp_nir_tex(&b, src_pos, key->texture_data_type); > + color = blorp_nir_tex(&b, &v, src_pos, key->texture_data_type); > } else { > /* Gen7+ hardware doesn't automaticaly blend. */ > - color = blorp_nir_manual_blend_average(&b, src_pos, > key->src_samples, > + color = blorp_nir_manual_blend_average(&b, &v, src_pos, > key->src_samples, > key->tex_aux_usage, > key->texture_data_type); > } > @@ -1430,7 +1423,7 @@ brw_blorp_build_nir_shader(struct brw_context *brw, > color = blorp_nir_manual_blend_bilinear(&b, src_pos, key->src_samples, > key, &v); > } else { > if (key->bilinear_filter) { > - color = blorp_nir_tex(&b, src_pos, key->texture_data_type); > + color = blorp_nir_tex(&b, &v, src_pos, key->texture_data_type); > } else { > /* We're going to use texelFetch, so we need integers */ > if (src_pos->num_components == 2) { > @@ -1476,9 +1469,9 @@ brw_blorp_build_nir_shader(struct brw_context *brw, > } else { > nir_ssa_def *mcs = NULL; > if (key->tex_aux_usage == ISL_AUX_USAGE_MCS) > - mcs = blorp_nir_txf_ms_mcs(&b, src_pos); > + mcs = blorp_nir_txf_ms_mcs(&b, &v, src_pos); > > - color = blorp_nir_txf_ms(&b, src_pos, mcs, > key->texture_data_type); > + color = blorp_nir_txf_ms(&b, &v, src_pos, mcs, > key->texture_data_type); > } > } > } > -- > 2.5.0.400.gff86faf > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev