mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 20:28:04 +02:00
i965: fix transform feedback with primitive restart
When querying GL_PRIMITIVES_GENERATED, if primitive restart is also used, then take the software primitive restart path so GL_PRIMITIVES_GENERATED is returned correctly. GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN is also updated since it will also affected by the same issue. As noted in brw_primitive_restart.c, with further work we should be able to move this situation back to a hardware handled path. Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
14311ef3f2
commit
8aa78c104a
3 changed files with 18 additions and 0 deletions
|
|
@ -1038,6 +1038,8 @@ struct brw_context
|
|||
uint32_t offset_0_batch_start;
|
||||
uint32_t primitives_generated;
|
||||
uint32_t primitives_written;
|
||||
bool counting_primitives_generated;
|
||||
bool counting_primitives_written;
|
||||
} sol;
|
||||
|
||||
uint32_t render_target_format[MESA_FORMAT_COUNT];
|
||||
|
|
|
|||
|
|
@ -69,6 +69,18 @@ can_cut_index_handle_prims(struct gl_context *ctx,
|
|||
GLuint nr_prims,
|
||||
const struct _mesa_index_buffer *ib)
|
||||
{
|
||||
struct brw_context *brw = brw_context(ctx);
|
||||
|
||||
if (brw->sol.counting_primitives_generated ||
|
||||
brw->sol.counting_primitives_written) {
|
||||
/* Counting primitives generated in hardware is not currently
|
||||
* supported, so take the software path. We need to investigate
|
||||
* the *_PRIMITIVES_COUNT registers to allow this to be handled
|
||||
* entirely in hardware.
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!can_cut_index_handle_restart_index(ctx, ib)) {
|
||||
/* The primitive restart index can't be handled, so take
|
||||
* the software path
|
||||
|
|
|
|||
|
|
@ -171,6 +171,7 @@ brw_begin_query(struct gl_context *ctx, struct gl_query_object *q)
|
|||
* it a software counter. So just reset the counter.
|
||||
*/
|
||||
brw->sol.primitives_generated = 0;
|
||||
brw->sol.counting_primitives_generated = true;
|
||||
break;
|
||||
|
||||
case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
|
||||
|
|
@ -178,6 +179,7 @@ brw_begin_query(struct gl_context *ctx, struct gl_query_object *q)
|
|||
* it a software counter. So just reset the counter.
|
||||
*/
|
||||
brw->sol.primitives_written = 0;
|
||||
brw->sol.counting_primitives_written = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -249,6 +251,7 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q)
|
|||
* the query object.
|
||||
*/
|
||||
query->Base.Result = brw->sol.primitives_generated;
|
||||
brw->sol.counting_primitives_generated = false;
|
||||
|
||||
/* And set brw->query.obj to NULL so that this query won't try to wait
|
||||
* for any rendering to complete.
|
||||
|
|
@ -262,6 +265,7 @@ brw_end_query(struct gl_context *ctx, struct gl_query_object *q)
|
|||
* the query object.
|
||||
*/
|
||||
query->Base.Result = brw->sol.primitives_written;
|
||||
brw->sol.counting_primitives_written = false;
|
||||
|
||||
/* And set brw->query.obj to NULL so that this query won't try to wait
|
||||
* for any rendering to complete.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue