mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 20:28:04 +02:00
svga: fix index buffer reference in the hw state
Instead of copy the index buffer resource handle to the hw state in the context structure, use pipe_resource_reference to properly reference the index buffer resource in the context. Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
ab99196b6b
commit
a1d74f5528
3 changed files with 16 additions and 6 deletions
|
|
@ -361,7 +361,7 @@ struct svga_hw_draw_state
|
|||
struct svga_winsys_surface *vbuffer_handles[PIPE_MAX_ATTRIBS];
|
||||
unsigned num_vbuffers;
|
||||
|
||||
struct svga_winsys_surface *ib; /**< index buffer for drawing */
|
||||
struct pipe_resource *ib; /**< index buffer for drawing */
|
||||
SVGA3dSurfaceFormat ib_format;
|
||||
unsigned ib_offset;
|
||||
|
||||
|
|
|
|||
|
|
@ -441,6 +441,7 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
|
|||
const unsigned vbuf_count = hwtnl->cmd.vbuf_count;
|
||||
enum pipe_error ret;
|
||||
unsigned i;
|
||||
boolean rebind_ib = FALSE;
|
||||
|
||||
assert(svga_have_vgpu10(svga));
|
||||
assert(hwtnl->cmd.prim_count == 0);
|
||||
|
|
@ -465,7 +466,7 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
|
|||
return ret;
|
||||
|
||||
/* Force rebinding the index buffer when needed */
|
||||
svga->state.hw_draw.ib = NULL;
|
||||
rebind_ib = TRUE;
|
||||
}
|
||||
|
||||
ret = validate_sampler_resources(svga);
|
||||
|
|
@ -563,15 +564,19 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
|
|||
SVGA3dSurfaceFormat indexFormat = xlate_index_format(range->indexWidth);
|
||||
|
||||
/* setup index buffer */
|
||||
if (ib_handle != svga->state.hw_draw.ib ||
|
||||
if (rebind_ib ||
|
||||
ib != svga->state.hw_draw.ib ||
|
||||
indexFormat != svga->state.hw_draw.ib_format ||
|
||||
range->indexArray.offset != svga->state.hw_draw.ib_offset) {
|
||||
|
||||
assert(indexFormat != SVGA3D_FORMAT_INVALID);
|
||||
ret = SVGA3D_vgpu10_SetIndexBuffer(svga->swc, ib_handle,
|
||||
indexFormat,
|
||||
range->indexArray.offset);
|
||||
if (ret != PIPE_OK)
|
||||
return ret;
|
||||
svga->state.hw_draw.ib = ib_handle;
|
||||
|
||||
pipe_resource_reference(&svga->state.hw_draw.ib, ib);
|
||||
svga->state.hw_draw.ib_format = indexFormat;
|
||||
svga->state.hw_draw.ib_offset = range->indexArray.offset;
|
||||
}
|
||||
|
|
@ -598,16 +603,19 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
|
|||
}
|
||||
else {
|
||||
/* non-indexed drawing */
|
||||
if (svga->state.hw_draw.ib_format != SVGA3D_FORMAT_INVALID) {
|
||||
if (svga->state.hw_draw.ib_format != SVGA3D_FORMAT_INVALID ||
|
||||
svga->state.hw_draw.ib != NULL) {
|
||||
/* Unbind previously bound index buffer */
|
||||
ret = SVGA3D_vgpu10_SetIndexBuffer(svga->swc, NULL,
|
||||
SVGA3D_FORMAT_INVALID, 0);
|
||||
if (ret != PIPE_OK)
|
||||
return ret;
|
||||
svga->state.hw_draw.ib_format = SVGA3D_FORMAT_INVALID;
|
||||
svga->state.hw_draw.ib = NULL;
|
||||
pipe_resource_reference(&svga->state.hw_draw.ib, NULL);
|
||||
}
|
||||
|
||||
assert(svga->state.hw_draw.ib == NULL);
|
||||
|
||||
if (instance_count > 1) {
|
||||
ret = SVGA3D_vgpu10_DrawInstanced(svga->swc,
|
||||
vcount,
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ void svga_cleanup_vertex_state( struct svga_context *svga )
|
|||
|
||||
for (i = 0 ; i < svga->curr.num_vertex_buffers; i++)
|
||||
pipe_resource_reference(&svga->curr.vb[i].buffer, NULL);
|
||||
|
||||
pipe_resource_reference(&svga->state.hw_draw.ib, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue