diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw.c | 14 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_draw_upload.c | 10 |
3 files changed, 31 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 25b3298235a..39cb8566b63 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1067,6 +1067,13 @@ struct brw_context int start_vertex_location; int base_vertex_location; + + /** + * Buffer and offset used for GL_ARB_shader_draw_parameters + * (for now, only gl_BaseVertex). + */ + drm_intel_bo *draw_params_bo; + uint32_t draw_params_offset; } draw; struct { diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index c2866d0dacc..efa85dec540 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -434,6 +434,20 @@ static bool brw_try_draw_prims( struct gl_context *ctx, brw->draw.start_vertex_location = prims[i].start; brw->draw.base_vertex_location = prims[i].basevertex; + if (prims[i].is_indirect) { + /* Point draw_params_bo at the indirect buffer. */ + brw->draw.draw_params_bo = + intel_buffer_object(ctx->DrawIndirectBuffer)->buffer; + brw->draw.draw_params_offset = + prims[i].indirect_offset + (prims[i].indexed ? 12 : 8); + } else { + /* Set draw_params_bo to NULL so brw_prepare_vertices knows it + * has to upload gl_BaseVertex and such if they're needed. + */ + brw->draw.draw_params_bo = NULL; + brw->draw.draw_params_offset = 0; + } + if (brw->gen < 6) brw_set_prim(brw, &prims[i]); else diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index 38b108751ce..37a65bcb3c9 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -607,11 +607,21 @@ brw_prepare_vertices(struct brw_context *brw) void brw_prepare_shader_draw_parameters(struct brw_context *brw) { + int *gl_basevertex_value; if (brw->draw.indexed) { brw->draw.start_vertex_location += brw->ib.start_vertex_offset; brw->draw.base_vertex_location += brw->vb.start_vertex_bias; + gl_basevertex_value = &brw->draw.base_vertex_location; } else { brw->draw.start_vertex_location += brw->vb.start_vertex_bias; + gl_basevertex_value = &brw->draw.start_vertex_location; + } + + /* For non-indirect draws, upload gl_BaseVertex. */ + if (brw->vs.prog_data->uses_vertexid && brw->draw.draw_params_bo == NULL) { + intel_upload_data(brw, gl_basevertex_value, 4, 4, + &brw->draw.draw_params_bo, + &brw->draw.draw_params_offset); } } |