mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-04 10:40:36 +01:00
[965] Allow more than one draw_prims per batchbuffer.
The comment about (vbo)_exec_api.c appeared to be stale, as the VBO code seems to only use non-named VBOs (not actual VBOs) or freshly-allocated VBO data. This brings a 2x speedup to openarena, because we can submit nearly-full batchbuffers instead of many 450-byte ones.
This commit is contained in:
parent
dc1608ae9d
commit
7da98d7eba
3 changed files with 17 additions and 7 deletions
|
|
@ -414,6 +414,7 @@ struct brw_context
|
|||
GLboolean emit_state_always;
|
||||
GLboolean wrap;
|
||||
GLboolean tmp_fallback;
|
||||
GLboolean no_batch_wrap;
|
||||
|
||||
struct {
|
||||
struct brw_state_flags dirty;
|
||||
|
|
|
|||
|
|
@ -270,12 +270,23 @@ static GLboolean brw_try_draw_prims( GLcontext *ctx,
|
|||
LOCK_HARDWARE(intel);
|
||||
|
||||
if (brw->intel.numClipRects == 0) {
|
||||
assert(intel->batch->ptr == intel->batch->map);
|
||||
UNLOCK_HARDWARE(intel);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
{
|
||||
/* Flush the batch if it's approaching full, so that we don't wrap while
|
||||
* we've got validated state that needs to be in the same batch as the
|
||||
* primitives. This fraction is just a guess (minimal full state plus
|
||||
* a primitive is around 512 bytes), and would be better if we had
|
||||
* an upper bound of how much we might emit in a single
|
||||
* brw_try_draw_prims().
|
||||
*/
|
||||
if (intel->batch->ptr - intel->batch->map > intel->batch->size * 3 / 4)
|
||||
intel_batchbuffer_flush(intel->batch);
|
||||
|
||||
brw->no_batch_wrap = GL_TRUE;
|
||||
|
||||
/* Set the first primitive early, ahead of validate_state:
|
||||
*/
|
||||
brw_set_prim(brw, prim[0].mode);
|
||||
|
|
@ -310,12 +321,7 @@ static GLboolean brw_try_draw_prims( GLcontext *ctx,
|
|||
|
||||
out:
|
||||
|
||||
/* Currently have to do this to synchronize with the map/unmap of
|
||||
* the vertex buffer in brw_exec_api.c. Not sure if there is any
|
||||
* way around this, as not every flush is due to a buffer filling
|
||||
* up.
|
||||
*/
|
||||
intel_batchbuffer_flush( brw->intel.batch );
|
||||
brw->no_batch_wrap = GL_FALSE;
|
||||
|
||||
/* Free any old data so it doesn't clog up texture memory - we
|
||||
* won't be referencing it again.
|
||||
|
|
|
|||
|
|
@ -91,6 +91,9 @@ static void brw_new_batch( struct intel_context *intel )
|
|||
{
|
||||
struct brw_context *brw = brw_context(&intel->ctx);
|
||||
|
||||
/* Check that we didn't just wrap our batchbuffer at a bad time. */
|
||||
assert(!brw->no_batch_wrap);
|
||||
|
||||
/* 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
|
||||
* is just in referenced buffers.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue