i965/draw: Use the real size for index buffers
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 17 May 2016 22:34:40 +0000 (15:34 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 24 May 2016 02:12:34 +0000 (19:12 -0700)
Previously, we were using the size of the whole BO which may be
substantially larger than the actual index buffer size.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_draw_upload.c
src/mesa/drivers/dri/i965/gen8_draw_upload.c

index 7a3afc9e126f6c7723e9d3a7706a5931b161a84b..358e579e4e96c27f4dd0f6920919b78454179de1 100644 (file)
@@ -991,6 +991,7 @@ struct brw_context
 
       /* Updates are signaled by BRW_NEW_INDEX_BUFFER. */
       drm_intel_bo *bo;
+      uint32_t size;
       GLuint type;
 
       /* Offset to index buffer index to use in CMD_3D_PRIM so that we can
index fd6ea8c3f50f5b79a088374a3c82341cac153fbc..3349161754bde311cf07070fa33bb033926faefb 100644 (file)
@@ -1018,7 +1018,8 @@ brw_upload_indices(struct brw_context *brw)
       return;
 
    ib_type_size = _mesa_sizeof_type(index_buffer->type);
-   ib_size = ib_type_size * index_buffer->count;
+   ib_size = index_buffer->count ? ib_type_size * index_buffer->count :
+                                   index_buffer->obj->Size;
    bufferobj = index_buffer->obj;
 
    /* Turn into a proper VBO:
@@ -1028,6 +1029,7 @@ brw_upload_indices(struct brw_context *brw)
        */
       intel_upload_data(brw, index_buffer->ptr, ib_size, ib_type_size,
                        &brw->ib.bo, &offset);
+      brw->ib.size = brw->ib.bo->size;
    } else {
       offset = (GLuint) (unsigned long) index_buffer->ptr;
 
@@ -1047,6 +1049,7 @@ brw_upload_indices(struct brw_context *brw)
 
          intel_upload_data(brw, map, ib_size, ib_type_size,
                            &brw->ib.bo, &offset);
+         brw->ib.size = brw->ib.bo->size;
 
          ctx->Driver.UnmapBuffer(ctx, bufferobj, MAP_INTERNAL);
       } else {
@@ -1056,6 +1059,7 @@ brw_upload_indices(struct brw_context *brw)
          if (bo != brw->ib.bo) {
             drm_intel_bo_unreference(brw->ib.bo);
             brw->ib.bo = bo;
+            brw->ib.size = bufferobj->Size;
             drm_intel_bo_reference(bo);
          }
       }
@@ -1110,7 +1114,7 @@ brw_emit_index_buffer(struct brw_context *brw)
              0);
    OUT_RELOC(brw->ib.bo,
              I915_GEM_DOMAIN_VERTEX, 0,
-            brw->ib.bo->size - 1);
+            brw->ib.size - 1);
    ADVANCE_BATCH();
 }
 
index 4bb3a59b8d2df401e81ebe48fa80f1744961f1f1..5b3f673c2adc0c101a54a4eb4360864730ca0fcc 100644 (file)
@@ -384,7 +384,7 @@ gen8_emit_index_buffer(struct brw_context *brw)
    OUT_BATCH(CMD_INDEX_BUFFER << 16 | (5 - 2));
    OUT_BATCH(brw_get_index_type(index_buffer->type) | mocs_wb);
    OUT_RELOC64(brw->ib.bo, I915_GEM_DOMAIN_VERTEX, 0, 0);
-   OUT_BATCH(brw->ib.bo->size);
+   OUT_BATCH(brw->ib.size);
    ADVANCE_BATCH();
 }