Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> It might be useful in the commit message to explain why this change is necessary.
On 08/08/2014 12:31 AM, Kenneth Graunke wrote: > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> > --- > src/mesa/drivers/dri/i965/brw_context.h | 8 ++++++++ > src/mesa/drivers/dri/i965/brw_draw.c | 17 ++++++++--------- > src/mesa/drivers/dri/i965/brw_draw.h | 2 ++ > src/mesa/drivers/dri/i965/brw_draw_upload.c | 12 ++++++++++++ > src/mesa/drivers/dri/i965/brw_state_upload.c | 6 +++--- > src/mesa/drivers/dri/i965/gen8_draw_upload.c | 1 + > 6 files changed, 34 insertions(+), 12 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_context.h > b/src/mesa/drivers/dri/i965/brw_context.h > index 1bbcf46..eea7938 100644 > --- a/src/mesa/drivers/dri/i965/brw_context.h > +++ b/src/mesa/drivers/dri/i965/brw_context.h > @@ -1058,6 +1058,14 @@ struct brw_context > bool no_depth_or_stencil; > > struct { > + /** Does the current draw use the index buffer? */ > + bool indexed; > + > + int start_vertex_location; > + int base_vertex_location; > + } draw; > + > + struct { > struct brw_vertex_element inputs[VERT_ATTRIB_MAX]; > struct brw_vertex_buffer buffers[VERT_ATTRIB_MAX]; > > diff --git a/src/mesa/drivers/dri/i965/brw_draw.c > b/src/mesa/drivers/dri/i965/brw_draw.c > index 4dae7d3..d8e16a7 100644 > --- a/src/mesa/drivers/dri/i965/brw_draw.c > +++ b/src/mesa/drivers/dri/i965/brw_draw.c > @@ -167,26 +167,19 @@ static void brw_emit_prim(struct brw_context *brw, > { > int verts_per_instance; > int vertex_access_type; > - int start_vertex_location; > - int base_vertex_location; > int indirect_flag; > > DBG("PRIM: %s %d %d\n", _mesa_lookup_enum_by_nr(prim->mode), > prim->start, prim->count); > > - start_vertex_location = prim->start; > - base_vertex_location = prim->basevertex; > if (prim->indexed) { > vertex_access_type = brw->gen >= 7 ? > GEN7_3DPRIM_VERTEXBUFFER_ACCESS_RANDOM : > GEN4_3DPRIM_VERTEXBUFFER_ACCESS_RANDOM; > - start_vertex_location += brw->ib.start_vertex_offset; > - base_vertex_location += brw->vb.start_vertex_bias; > } else { > vertex_access_type = brw->gen >= 7 ? > GEN7_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL : > GEN4_3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL; > - start_vertex_location += brw->vb.start_vertex_bias; > } > > /* We only need to trim the primitive count on pre-Gen6. */ > @@ -261,10 +254,10 @@ static void brw_emit_prim(struct brw_context *brw, > vertex_access_type); > } > OUT_BATCH(verts_per_instance); > - OUT_BATCH(start_vertex_location); > + OUT_BATCH(brw->draw.start_vertex_location); > OUT_BATCH(prim->num_instances); > OUT_BATCH(prim->base_instance); > - OUT_BATCH(base_vertex_location); > + OUT_BATCH(brw->draw.base_vertex_location); > ADVANCE_BATCH(); > > /* Only used on Sandybridge; harmless to set elsewhere. */ > @@ -467,12 +460,18 @@ static bool brw_try_draw_prims( struct gl_context *ctx, > brw_merge_inputs(brw, arrays); > } > } > + > + brw->draw.indexed = prims[i].indexed; > + brw->draw.start_vertex_location = prims[i].start; > + brw->draw.base_vertex_location = prims[i].basevertex; > + > if (brw->gen < 6) > brw_set_prim(brw, &prims[i]); > else > gen6_set_prim(brw, &prims[i]); > > retry: > + > /* Note that before the loop, brw->state.dirty.brw was set to != 0, and > * that the state updated in the loop outside of this block is that in > * *_set_prim or intel_batchbuffer_flush(), which only impacts > diff --git a/src/mesa/drivers/dri/i965/brw_draw.h > b/src/mesa/drivers/dri/i965/brw_draw.h > index 774f1d4..fc83dcd 100644 > --- a/src/mesa/drivers/dri/i965/brw_draw.h > +++ b/src/mesa/drivers/dri/i965/brw_draw.h > @@ -47,6 +47,8 @@ void brw_draw_prims( struct gl_context *ctx, > void brw_draw_init( struct brw_context *brw ); > void brw_draw_destroy( struct brw_context *brw ); > > +void brw_prepare_shader_draw_parameters(struct brw_context *); > + > /* brw_primitive_restart.c */ > GLboolean > brw_handle_primitive_restart(struct gl_context *ctx, > diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c > b/src/mesa/drivers/dri/i965/brw_draw_upload.c > index 5d6b766..38b1087 100644 > --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c > +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c > @@ -604,12 +604,24 @@ brw_prepare_vertices(struct brw_context *brw) > brw->vb.nr_buffers = j; > } > > +void > +brw_prepare_shader_draw_parameters(struct brw_context *brw) > +{ > + if (brw->draw.indexed) { > + brw->draw.start_vertex_location += brw->ib.start_vertex_offset; > + brw->draw.base_vertex_location += brw->vb.start_vertex_bias; > + } else { > + brw->draw.start_vertex_location += brw->vb.start_vertex_bias; > + } > +} > + > static void brw_emit_vertices(struct brw_context *brw) > { > struct gl_context *ctx = &brw->ctx; > GLuint i, nr_elements; > > brw_prepare_vertices(brw); > + brw_prepare_shader_draw_parameters(brw); > > brw_emit_query_begin(brw); > > diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c > b/src/mesa/drivers/dri/i965/brw_state_upload.c > index 3a452c3..e946621 100644 > --- a/src/mesa/drivers/dri/i965/brw_state_upload.c > +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c > @@ -98,7 +98,7 @@ static const struct brw_tracked_state *gen4_atoms[] = > &brw_psp_urb_cbs, > > &brw_drawing_rect, > - &brw_indices, > + &brw_indices, /* must come before brw_vertices */ > &brw_index_buffer, > &brw_vertices, > > @@ -169,7 +169,7 @@ static const struct brw_tracked_state *gen6_atoms[] = > > &brw_drawing_rect, > > - &brw_indices, > + &brw_indices, /* must come before brw_vertices */ > &brw_index_buffer, > &brw_vertices, > }; > @@ -244,7 +244,7 @@ static const struct brw_tracked_state *gen7_atoms[] = > > &brw_drawing_rect, > > - &brw_indices, > + &brw_indices, /* must come before brw_vertices */ > &brw_index_buffer, > &brw_vertices, > > diff --git a/src/mesa/drivers/dri/i965/gen8_draw_upload.c > b/src/mesa/drivers/dri/i965/gen8_draw_upload.c > index 4d62739..8e4fe5d 100644 > --- a/src/mesa/drivers/dri/i965/gen8_draw_upload.c > +++ b/src/mesa/drivers/dri/i965/gen8_draw_upload.c > @@ -41,6 +41,7 @@ gen8_emit_vertices(struct brw_context *brw) > struct gl_context *ctx = &brw->ctx; > > brw_prepare_vertices(brw); > + brw_prepare_shader_draw_parameters(brw); > > if (brw->vs.prog_data->uses_vertexid) { > unsigned vue = brw->vb.nr_enabled; > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev