i965: upload transient indices into the same discontiguous buffer
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 11 Feb 2011 00:18:21 +0000 (00:18 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 21 Feb 2011 12:59:35 +0000 (12:59 +0000)
As we now pack the indices into a common upload buffer, we can reuse a
single CMD_INDEX_BUFFER packet and translate each invocation with a
start vertex offset.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_draw_upload.c

index 73b18acaf333571263685205520df40e0f3aa1b7..1e2c5a478373644fe2c7057630b9276d140759d7 100644 (file)
@@ -505,7 +505,6 @@ struct brw_context
       /* Updates to these fields are signaled by BRW_NEW_INDEX_BUFFER. */
       drm_intel_bo *bo;
       unsigned int offset;
-      unsigned int size;
       /* Offset to index buffer index to use in CMD_3D_PRIM so that we can
        * avoid re-uploading the IB packet over and over if we're actually
        * referencing the same index buffer.
index 8f5789e8ab51f1407a98ee241d37b53f1403f4c7..1b3b62fc34db997a6ca8165827ee5d9908fc2c8f 100644 (file)
@@ -564,14 +564,14 @@ static void brw_prepare_indices(struct brw_context *brw)
    /* Turn into a proper VBO:
     */
    if (!_mesa_is_bufferobj(bufferobj)) {
-      brw->ib.start_vertex_offset = 0;
 
       /* Get new bufferobj, offset:
        */
       intel_upload_data(&brw->intel, index_buffer->ptr, ib_size, &bo, &offset);
+      brw->ib.start_vertex_offset = offset / ib_type_size;
+      offset = 0;
    } else {
       offset = (GLuint) (unsigned long) index_buffer->ptr;
-      brw->ib.start_vertex_offset = 0;
 
       /* If the index buffer isn't aligned to its element size, we have to
        * rebase it into a temporary.
@@ -584,6 +584,8 @@ static void brw_prepare_indices(struct brw_context *brw)
            map += offset;
 
           intel_upload_data(&brw->intel, map, ib_size, &bo, &offset);
+          brw->ib.start_vertex_offset = offset / ib_type_size;
+          offset = 0;
 
            ctx->Driver.UnmapBuffer(ctx, GL_ELEMENT_ARRAY_BUFFER_ARB, bufferobj);
        } else {
@@ -595,26 +597,20 @@ static void brw_prepare_indices(struct brw_context *brw)
 
          bo = intel_bufferobj_source(intel, intel_buffer_object(bufferobj),
                                      &offset);
-
-         ib_size = bo->size;
+         drm_intel_bo_reference(bo);
        }
    }
 
-   if (brw->ib.bo != bo ||
-       brw->ib.offset != offset ||
-       brw->ib.size != ib_size)
-   {
+   if (brw->ib.bo != bo || brw->ib.offset != offset) {
       drm_intel_bo_unreference(brw->ib.bo);
       brw->ib.bo = bo;
       brw->ib.offset = offset;
-      brw->ib.size = ib_size;
 
+      brw_add_validated_bo(brw, brw->ib.bo);
       brw->state.dirty.brw |= BRW_NEW_INDEX_BUFFER;
    } else {
       drm_intel_bo_unreference(bo);
    }
-
-   brw_add_validated_bo(brw, brw->ib.bo);
 }
 
 const struct brw_tracked_state brw_indices = {
@@ -644,7 +640,7 @@ static void brw_emit_index_buffer(struct brw_context *brw)
              brw->ib.offset);
    OUT_RELOC(brw->ib.bo,
              I915_GEM_DOMAIN_VERTEX, 0,
-             brw->ib.offset + brw->ib.size - 1);
+            brw->ib.bo->size - 1);
    ADVANCE_BATCH();
 }