aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2016-05-17 15:34:40 -0700
committerJason Ekstrand <[email protected]>2016-05-23 19:12:34 -0700
commitaec10a1d5b4a0802f6f09d1b83c79f53ecd3d29f (patch)
tree70d9f9fd944e5d33ab2ce396f22fbf279bce94f8 /src
parent7c8dfa78b98a12c1c5f74d11433c8554d4c90657 (diff)
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_context.h1
-rw-r--r--src/mesa/drivers/dri/i965/brw_draw_upload.c8
-rw-r--r--src/mesa/drivers/dri/i965/gen8_draw_upload.c2
3 files changed, 8 insertions, 3 deletions
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();
}