From: Ian Romanick <ian.d.roman...@intel.com> Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> Cc: "10.2" <mesa-sta...@lists.freedesktop.org> --- src/mesa/drivers/dri/i965/brw_draw.c | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index ac21656..dd914b6 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -40,6 +40,7 @@ #include "swrast/swrast.h" #include "swrast_setup/swrast_setup.h" #include "drivers/common/meta.h" +#include "program/prog_parameter.h" #include "brw_blorp.h" #include "brw_draw.h" @@ -392,6 +393,27 @@ static bool brw_try_draw_prims( struct gl_context *ctx, bool retval = true; GLuint i; bool fail_next = false; + GLint last_start = -1; + GLint base_vertex_idx = -1; + + struct gl_program_parameter_list *const plist = + ctx->VertexProgram._Current->Base.Parameters; + + /* Find the storage associated with STATE_BASE_VERTEX. If there is + * storage, then we'll need to update its value each time + * prims[i].basevertex changes. + */ + for (unsigned j = 0; j < plist->NumParameters; j++) { + if (plist->Parameters[j].StateIndexes[0] == STATE_INTERNAL + && plist->Parameters[j].StateIndexes[1] == STATE_BASE_VERTEX) { + base_vertex_idx = j; + break; + } + } + + if (base_vertex_idx >= 0) { + ctx->VertexProgram._Current->Base.Parameters->ParameterValues[base_vertex_idx][0].i = brw->basevertex; + } if (ctx->NewState) _mesa_update_state( ctx ); @@ -462,11 +484,26 @@ static bool brw_try_draw_prims( struct gl_context *ctx, brw->basevertex != prims[i].basevertex) { brw->num_instances = prims[i].num_instances; brw->basevertex = prims[i].basevertex; + + if (base_vertex_idx >= 0) { + plist->ParameterValues[base_vertex_idx][0].i = brw->basevertex; + ctx->NewState |= _NEW_PROGRAM_CONSTANTS; + _mesa_update_state(ctx); + } + if (i > 0) { /* For i == 0 we just did this before the loop */ brw->state.dirty.brw |= BRW_NEW_VERTICES; brw_merge_inputs(brw, arrays); } } + + if (prims[i].start != last_start && base_vertex_idx >= 0) { + plist->ParameterValues[base_vertex_idx][0].i = prims[i].start; + ctx->NewState |= _NEW_PROGRAM_CONSTANTS; + _mesa_update_state(ctx); + last_start = prims[i].start; + } + if (brw->gen < 6) brw_set_prim(brw, &prims[i]); else -- 1.8.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev