diff options
author | Charmaine Lee <[email protected]> | 2016-11-03 10:35:55 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2017-04-07 13:46:43 -0600 |
commit | a421d45e61c56c48bcc0fed19b15b5081c8f32d3 (patch) | |
tree | 15b75e85fa486c4731fbb1515afbbf443ad9988b | |
parent | b4c4ee076244d0518af98e0beca1c12942c4bc36 (diff) |
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 <[email protected]>
-rw-r--r-- | src/gallium/drivers/svga/svga_surface.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/gallium/drivers/svga/svga_surface.c b/src/gallium/drivers/svga/svga_surface.c index cf0052727df..ef566c4e255 100644 --- a/src/gallium/drivers/svga/svga_surface.c +++ b/src/gallium/drivers/svga/svga_surface.c @@ -534,20 +534,31 @@ svga_surface_destroy(struct pipe_context *pipe, if (s->view_id != SVGA3D_INVALID_ID) { unsigned try; - 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); + /* The SVGA3D device will generate a device error if the + * render target view or depth stencil view is destroyed from + * a context other than the one it was created with. + * Similar to shader resource view, in this case, we will skip + * the destroy for now. + */ + if (surf->context != pipe) { + _debug_printf("context mismatch in %s\n", __func__); + } + else { + 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); } - 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); |