i965: Cope with batch getting flushed in the middle of batchbuffer emits.

This isn't required for GEM (at least, yet), but the check_aperture code
for non-GEM results in batch getting flushed during emit.  brw_state_upload
restarts state emits, but a bunch of the state emit functions were assuming
that they would be called exactly once, after prepare and before new_batch.

Bug #17179.
This commit is contained in:
Eric Anholt
2008-09-23 15:53:29 -07:00
parent 4b038e24b0
commit d533da2db8
5 changed files with 14 additions and 12 deletions
+5
View File
@@ -557,6 +557,11 @@ struct brw_context
GLfloat *last_buf;
GLuint last_bufsz;
/**
* Whether we should create a new bo instead of reusing the old one
* (if we just dispatch the batch pointing at the old one.
*/
GLboolean need_new_bo;
} curbe;
struct {
+2 -1
View File
@@ -282,7 +282,8 @@ static void prepare_constant_buffer(struct brw_context *brw)
brw->curbe.last_bufsz = bufsz;
if (brw->curbe.curbe_bo != NULL &&
brw->curbe.curbe_next_offset + bufsz > brw->curbe.curbe_bo->size)
(brw->curbe.need_new_bo ||
brw->curbe.curbe_next_offset + bufsz > brw->curbe.curbe_bo->size))
{
dri_bo_unreference(brw->curbe.curbe_bo);
brw->curbe.curbe_bo = NULL;
+6 -3
View File
@@ -156,11 +156,13 @@ static void brw_emit_prim( struct brw_context *brw,
static void brw_merge_inputs( struct brw_context *brw,
const struct gl_client_array *arrays[])
{
struct brw_vertex_element *inputs = brw->vb.inputs;
struct brw_vertex_info old = brw->vb.info;
GLuint i;
memset(inputs, 0, sizeof(*inputs));
for (i = 0; i < VERT_ATTRIB_MAX; i++)
dri_bo_unreference(brw->vb.inputs[i].bo);
memset(&brw->vb.inputs, 0, sizeof(brw->vb.inputs));
memset(&brw->vb.info, 0, sizeof(brw->vb.info));
for (i = 0; i < VERT_ATTRIB_MAX; i++) {
@@ -171,7 +173,8 @@ static void brw_merge_inputs( struct brw_context *brw,
if (arrays[i]->StrideB != 0)
brw->vb.info.varying |= 1 << i;
brw->vb.info.sizes[i/16] |= (inputs[i].glarray->Size - 1) << ((i%16) * 2);
brw->vb.info.sizes[i/16] |= (brw->vb.inputs[i].glarray->Size - 1) <<
((i%16) * 2);
}
}
@@ -455,12 +455,6 @@ static void brw_emit_vertices(struct brw_context *brw)
input->offset);
OUT_BATCH(brw->vb.max_index);
OUT_BATCH(0); /* Instance data step rate */
/* Unreference the buffer so it can get freed, now that we won't
* touch it any more.
*/
dri_bo_unreference(input->bo);
input->bo = NULL;
}
ADVANCE_BATCH();
+1 -2
View File
@@ -97,8 +97,7 @@ static void brw_new_batch( struct intel_context *intel )
/* Check that we didn't just wrap our batchbuffer at a bad time. */
assert(!brw->no_batch_wrap);
dri_bo_unreference(brw->curbe.curbe_bo);
brw->curbe.curbe_bo = NULL;
brw->curbe.need_new_bo = GL_TRUE;
/* Mark all context state as needing to be re-emitted.
* This is probably not as severe as on 915, since almost all of our state