Browse Source

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>
tags/mesa-8.0-rc1
Eric Anholt 13 years ago
parent
commit
7f91c8bf2b

+ 10
- 3
src/mesa/drivers/dri/i965/brw_context.c View File

@@ -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 )) {

+ 5
- 0
src/mesa/drivers/dri/i965/brw_context.h View File

@@ -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);



/*======================================================================

+ 16
- 0
src/mesa/drivers/dri/i965/gen7_sol_state.c View File

@@ -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);
}

Loading…
Cancel
Save