From: Jason Ekstrand Date: Tue, 17 May 2016 22:34:40 +0000 (-0700) Subject: i965/draw: Use the real size for index buffers X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=aec10a1d5b4a0802f6f09d1b83c79f53ecd3d29f;p=mesa.git i965/draw: Use the real size for index buffers 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 --- diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 7a3afc9e126..358e579e4e9 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -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 diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index fd6ea8c3f50..3349161754b 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -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(); } diff --git a/src/mesa/drivers/dri/i965/gen8_draw_upload.c b/src/mesa/drivers/dri/i965/gen8_draw_upload.c index 4bb3a59b8d2..5b3f673c2ad 100644 --- a/src/mesa/drivers/dri/i965/gen8_draw_upload.c +++ b/src/mesa/drivers/dri/i965/gen8_draw_upload.c @@ -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(); }