summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2016-08-26 16:25:39 -0600
committerBrian Paul <[email protected]>2016-08-29 17:46:50 -0600
commitec16a5b0915a4a764e077f2b6abc8723143e488d (patch)
tree354e349406394677bdeea48be72ffad4ad842b7c
parent646afc6ff75fca5a961549ffe175877f903ef5c7 (diff)
svga: fix a texture readback bug
Backing views/surfaces are used to handle the case when a resource is bound both as a render target and as a sampler source (such as when doing auto mipmap generation). This patch fixes a bug where mapping a resource (to do a glReadPixels) was reading the stale data in the original surface rather than the backing surface which was rendered to. We need to propagate the backing resource (which we rendered to) back to the original resource before we read from it. The problem was the svga_propagate_rendertargets() function was examining the wrong surface views. This fixes the "poc9" test described in VMware bug 1686661. Also tested with Piglit, Cinebench, Lightsmark, etc. Reviewed-by: Charmaine Lee <[email protected]>
-rw-r--r--src/gallium/drivers/svga/svga_context.c2
-rw-r--r--src/gallium/drivers/svga/svga_surface.c16
2 files changed, 12 insertions, 6 deletions
diff --git a/src/gallium/drivers/svga/svga_context.c b/src/gallium/drivers/svga/svga_context.c
index b3b2728305d..78fb558f408 100644
--- a/src/gallium/drivers/svga/svga_context.c
+++ b/src/gallium/drivers/svga/svga_context.c
@@ -229,6 +229,8 @@ struct pipe_context *svga_context_create(struct pipe_screen *screen,
memset(svga->state.hw_draw.sampler_views, 0,
sizeof(svga->state.hw_draw.sampler_views));
svga->state.hw_draw.num_views = 0;
+ svga->state.hw_draw.num_rendertargets = 0;
+ svga->state.hw_draw.dsv = NULL;
/* Initialize the shader pointers */
svga->state.hw_draw.vs = NULL;
diff --git a/src/gallium/drivers/svga/svga_surface.c b/src/gallium/drivers/svga/svga_surface.c
index 75e76fb297e..f6a791332c9 100644
--- a/src/gallium/drivers/svga/svga_surface.c
+++ b/src/gallium/drivers/svga/svga_surface.c
@@ -664,17 +664,21 @@ svga_propagate_surface(struct svga_context *svga, struct pipe_surface *surf)
void
svga_propagate_rendertargets(struct svga_context *svga)
{
- const unsigned num_cbufs = svga_screen(svga->pipe.screen)->max_color_buffers;
unsigned i;
- for (i = 0; i < num_cbufs; i++) {
- if (svga->curr.framebuffer.cbufs[i]) {
- svga_propagate_surface(svga, svga->curr.framebuffer.cbufs[i]);
+ /* Note that we examine the svga->state.hw_draw.framebuffer surfaces,
+ * not the svga->curr.framebuffer surfaces, because it's the former
+ * surfaces which may be backing surface views (the actual render targets).
+ */
+ for (i = 0; i < svga->state.hw_draw.num_rendertargets; i++) {
+ struct pipe_surface *s = svga->state.hw_draw.rtv[i];
+ if (s) {
+ svga_propagate_surface(svga, s);
}
}
- if (svga->curr.framebuffer.zsbuf) {
- svga_propagate_surface(svga, svga->curr.framebuffer.zsbuf);
+ if (svga->state.hw_draw.dsv) {
+ svga_propagate_surface(svga, svga->state.hw_draw.dsv);
}
}