i965: Reemit vertex state between indirect multi draws
If we're doing an indirect draw, prims[i].basevertex is always 0 and the real base vertex value is in the indirect parameter buffer. We try to avoid flagging BRW_NEW_VERTICES if prims[i].basevertex doesn't change, which then breaks down for indirect draws. Thus, if a program uses base vertex or base instance, and the draw call is indirect, always flag BRW_NEW_VERTICES. A new piglit test, spec/ARB_shader_draw_parameters/drawid-indirect-vertexid tests this. Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
This commit is contained in:
parent
f9283f2668
commit
581f81860e
|
@ -491,9 +491,29 @@ brw_try_draw_prims(struct gl_context *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
brw->draw.params.gl_basevertex =
|
||||
/* Determine if we need to flag BRW_NEW_VERTICES for updating the
|
||||
* gl_BaseVertexARB or gl_BaseInstanceARB values. For indirect draw, we
|
||||
* always flag if the shader uses one of the values. For direct draws,
|
||||
* we only flag if the values change.
|
||||
*/
|
||||
const int new_basevertex =
|
||||
prims[i].indexed ? prims[i].basevertex : prims[i].start;
|
||||
brw->draw.params.gl_baseinstance = prims[i].base_instance;
|
||||
const int new_baseinstance = prims[i].base_instance;
|
||||
if (i > 0) {
|
||||
const bool uses_draw_parameters =
|
||||
brw->vs.prog_data->uses_basevertex ||
|
||||
brw->vs.prog_data->uses_baseinstance;
|
||||
|
||||
if ((uses_draw_parameters && prims[i].is_indirect) ||
|
||||
(brw->vs.prog_data->uses_basevertex &&
|
||||
brw->draw.params.gl_basevertex != new_basevertex) ||
|
||||
(brw->vs.prog_data->uses_baseinstance &&
|
||||
brw->draw.params.gl_baseinstance != new_baseinstance))
|
||||
brw->ctx.NewDriverState |= BRW_NEW_VERTICES;
|
||||
}
|
||||
|
||||
brw->draw.params.gl_basevertex = new_basevertex;
|
||||
brw->draw.params.gl_baseinstance = new_baseinstance;
|
||||
drm_intel_bo_unreference(brw->draw.draw_params_bo);
|
||||
|
||||
if (prims[i].is_indirect) {
|
||||
|
|
Loading…
Reference in New Issue