svga: only destroy render target view from a context that created it

A texture can be destroyed from a different context from which it is
created, but destroying the render target view from a different context
will cause svga device errors. Similar to shader resource view,
this patch skips destroying render target view or depth stencil view
from a non-parent context.

Fixes driver errors running NobelClinician Viewer application.

Tested with NobelClinician Viewer, MTT piglit, glretrace.

Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Charmaine Lee 2016-11-03 10:35:55 -07:00 committed by Brian Paul
parent b4c4ee0762
commit a421d45e61

View file

@ -534,20 +534,31 @@ svga_surface_destroy(struct pipe_context *pipe,
if (s->view_id != SVGA3D_INVALID_ID) { if (s->view_id != SVGA3D_INVALID_ID) {
unsigned try; unsigned try;
assert(svga_have_vgpu10(svga)); /* The SVGA3D device will generate a device error if the
for (try = 0; try < 2; try++) { * render target view or depth stencil view is destroyed from
if (util_format_is_depth_or_stencil(s->base.format)) { * a context other than the one it was created with.
ret = SVGA3D_vgpu10_DestroyDepthStencilView(svga->swc, s->view_id); * Similar to shader resource view, in this case, we will skip
} * the destroy for now.
else { */
ret = SVGA3D_vgpu10_DestroyRenderTargetView(svga->swc, s->view_id); if (surf->context != pipe) {
} _debug_printf("context mismatch in %s\n", __func__);
if (ret == PIPE_OK) }
break; else {
svga_context_flush(svga, NULL); assert(svga_have_vgpu10(svga));
for (try = 0; try < 2; try++) {
if (util_format_is_depth_or_stencil(s->base.format)) {
ret = SVGA3D_vgpu10_DestroyDepthStencilView(svga->swc, s->view_id);
}
else {
ret = SVGA3D_vgpu10_DestroyRenderTargetView(svga->swc, s->view_id);
}
if (ret == PIPE_OK)
break;
svga_context_flush(svga, NULL);
}
assert(ret == PIPE_OK);
util_bitmask_clear(svga->surface_view_id_bm, s->view_id);
} }
assert(ret == PIPE_OK);
util_bitmask_clear(svga->surface_view_id_bm, s->view_id);
} }
pipe_resource_reference(&surf->texture, NULL); pipe_resource_reference(&surf->texture, NULL);