i965/gen7: Flush the batch between transform feedbacks.
We need the kernel to reset our pointers to 0 in between. Note that the initialization of function pointer had to move to after InitContext since we didn't have intel->gen set up yet. Fixes piglit EXT_transform_feedback/immediate-reuse Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -109,7 +109,8 @@ static void brwPrepareExecBegin(struct gl_context *ctx)
|
||||
}
|
||||
}
|
||||
|
||||
static void brwInitDriverFunctions( struct dd_function_table *functions )
|
||||
static void brwInitDriverFunctions(struct intel_screen *screen,
|
||||
struct dd_function_table *functions)
|
||||
{
|
||||
intelInitDriverFunctions( functions );
|
||||
|
||||
@@ -118,7 +119,11 @@ static void brwInitDriverFunctions( struct dd_function_table *functions )
|
||||
|
||||
functions->PrepareExecBegin = brwPrepareExecBegin;
|
||||
functions->BeginTransformFeedback = brw_begin_transform_feedback;
|
||||
functions->EndTransformFeedback = brw_end_transform_feedback;
|
||||
|
||||
if (screen->gen >= 7)
|
||||
functions->EndTransformFeedback = gen7_end_transform_feedback;
|
||||
else
|
||||
functions->EndTransformFeedback = brw_end_transform_feedback;
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -127,6 +132,8 @@ brwCreateContext(int api,
|
||||
__DRIcontext *driContextPriv,
|
||||
void *sharedContextPrivate)
|
||||
{
|
||||
__DRIscreen *sPriv = driContextPriv->driScreenPriv;
|
||||
struct intel_screen *screen = sPriv->driverPrivate;
|
||||
struct dd_function_table functions;
|
||||
struct brw_context *brw = rzalloc(NULL, struct brw_context);
|
||||
struct intel_context *intel = &brw->intel;
|
||||
@@ -138,7 +145,7 @@ brwCreateContext(int api,
|
||||
return false;
|
||||
}
|
||||
|
||||
brwInitDriverFunctions( &functions );
|
||||
brwInitDriverFunctions(screen, &functions);
|
||||
|
||||
if (!intelInitContext( intel, api, mesaVis, driContextPriv,
|
||||
sharedContextPrivate, &functions )) {
|
||||
|
||||
@@ -1093,6 +1093,11 @@ void
|
||||
brw_end_transform_feedback(struct gl_context *ctx,
|
||||
struct gl_transform_feedback_object *obj);
|
||||
|
||||
/* gen7_sol_state.c */
|
||||
void
|
||||
gen7_end_transform_feedback(struct gl_context *ctx,
|
||||
struct gl_transform_feedback_object *obj);
|
||||
|
||||
|
||||
|
||||
/*======================================================================
|
||||
|
||||
@@ -264,3 +264,19 @@ const struct brw_tracked_state gen7_sol_state = {
|
||||
},
|
||||
.emit = upload_sol_state,
|
||||
};
|
||||
|
||||
void
|
||||
gen7_end_transform_feedback(struct gl_context *ctx,
|
||||
struct gl_transform_feedback_object *obj)
|
||||
{
|
||||
/* Because we have to rely on the kernel to reset our SO write offsets, and
|
||||
* we only get to do it once per batchbuffer, flush the batch after feedback
|
||||
* so another transform feedback can get the write offset reset it needs.
|
||||
*
|
||||
* This also covers any cache flushing required.
|
||||
*/
|
||||
struct brw_context *brw = brw_context(ctx);
|
||||
struct intel_context *intel = &brw->intel;
|
||||
|
||||
intel_batchbuffer_flush(intel);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user