svga: fix vertex buffer binding issue
When we ran Viewperf11's Maya-03 test 3 we saw warnings about flushing the command buffer with mapped buffers. This happened when transitioning from hardware rendering to a 'draw' fallback path. The problem is the util_set_vertex_buffers_count() function doesn't do exactly what we want in svga_hwtnl_vertex_buffers(). In a case such as dst_count=2, dst={bufA, bufB}, count=1 and src={bufC}, when the function returns we'll have dst_count=2 and dst={bufC, bufB}. What we really want is dst_count=1 and dst={bufC, NULL}. As it was, we were telling the svga device that there were two vertex buffers when in fact we really only needed one for the subsequent drawing command. In this particular case, we first did hardware drawing with {bufA, bufB} then we transitioned to the 'draw' module, consuming vertex data from bufA and bufB and writing the new vertex data to bufC. bufA and bufB are mapped for reading when we flush the command buffer but should not be referenced by the command buffer. The above change fixes that. No Piglit regressions. Also tested with Viewperf, Google Earth, Heaven, etc. VMware bug 1842059 Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
parent
a36a1ea80a
commit
28feb63580
|
@ -134,8 +134,25 @@ void
|
||||||
svga_hwtnl_vertex_buffers(struct svga_hwtnl *hwtnl,
|
svga_hwtnl_vertex_buffers(struct svga_hwtnl *hwtnl,
|
||||||
unsigned count, struct pipe_vertex_buffer *buffers)
|
unsigned count, struct pipe_vertex_buffer *buffers)
|
||||||
{
|
{
|
||||||
util_set_vertex_buffers_count(hwtnl->cmd.vbufs,
|
struct pipe_vertex_buffer *dst = hwtnl->cmd.vbufs;
|
||||||
&hwtnl->cmd.vbuf_count, buffers, 0, count);
|
const struct pipe_vertex_buffer *src = buffers;
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
pipe_resource_reference(&dst[i].buffer, src[i].buffer);
|
||||||
|
dst[i].user_buffer = src[i].user_buffer;
|
||||||
|
dst[i].stride = src[i].stride;
|
||||||
|
dst[i].buffer_offset = src[i].buffer_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* release old buffer references */
|
||||||
|
for ( ; i < hwtnl->cmd.vbuf_count; i++) {
|
||||||
|
pipe_resource_reference(&dst[i].buffer, NULL);
|
||||||
|
dst[i].user_buffer = NULL; /* just to be safe */
|
||||||
|
/* don't bother zeroing stride/offset fields */
|
||||||
|
}
|
||||||
|
|
||||||
|
hwtnl->cmd.vbuf_count = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -583,6 +600,16 @@ draw_vgpu10(struct svga_hwtnl *hwtnl,
|
||||||
*/
|
*/
|
||||||
num_vbuffers = MAX2(vbuf_count, svga->state.hw_draw.num_vbuffers);
|
num_vbuffers = MAX2(vbuf_count, svga->state.hw_draw.num_vbuffers);
|
||||||
|
|
||||||
|
/* Zero-out the old buffers we want to unbind (the number of loop
|
||||||
|
* iterations here is typically very small, and often zero.)
|
||||||
|
*/
|
||||||
|
for (i = vbuf_count; i < num_vbuffers; i++) {
|
||||||
|
vbuffer_attrs[i].sid = 0;
|
||||||
|
vbuffer_attrs[i].stride = 0;
|
||||||
|
vbuffer_attrs[i].offset = 0;
|
||||||
|
vbuffer_handles[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (num_vbuffers > 0) {
|
if (num_vbuffers > 0) {
|
||||||
|
|
||||||
ret = SVGA3D_vgpu10_SetVertexBuffers(svga->swc, num_vbuffers,
|
ret = SVGA3D_vgpu10_SetVertexBuffers(svga->swc, num_vbuffers,
|
||||||
|
|
Loading…
Reference in New Issue