OSDN Git Service

svga: rebind using render target surfaces in hw draw state
authorCharmaine Lee <charmainel@vmware.com>
Thu, 30 Jun 2016 20:08:25 +0000 (13:08 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 8 Jul 2016 18:53:20 +0000 (12:53 -0600)
Currently when we rebind framebuffer resources at the beginning of
the command buffer, we use the color buffer surfaces saved in the context
hw clear state. But the surfaces could be different from the actual
emitted render target surfaces if any of the color buffer surfaces
is also used for shader resource, in that case, we create
a backed surface for the collided render target surface. So to rebind
the framebuffer resources correctly, use the render target surfaces saved
in the context hw draw state.

Tested with Heaven, Lightsmark2008, MTT piglit, glretrace, conform.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/drivers/svga/svga_state_framebuffer.c

index 12efc49..ae5dc36 100644 (file)
@@ -289,7 +289,7 @@ enum pipe_error
 svga_rebind_framebuffer_bindings(struct svga_context *svga)
 {
    const struct svga_screen *ss = svga_screen(svga->pipe.screen);
-   struct pipe_framebuffer_state *hw = &svga->state.hw_clear.framebuffer;
+   struct svga_hw_draw_state *hw = &svga->state.hw_draw;
    unsigned i;
    enum pipe_error ret;
 
@@ -298,10 +298,10 @@ svga_rebind_framebuffer_bindings(struct svga_context *svga)
    if (!svga->rebind.flags.rendertargets)
       return PIPE_OK;
 
-   for (i = 0; i < ss->max_color_buffers; i++) {
-      if (hw->cbufs[i]) {
+   for (i = 0; i < hw->num_rendertargets; i++) {
+      if (hw->rtv[i]) {
          ret = svga->swc->resource_rebind(svga->swc,
-                                          svga_surface(hw->cbufs[i])->handle,
+                                          svga_surface(hw->rtv[i])->handle,
                                           NULL,
                                           SVGA_RELOC_WRITE);
          if (ret != PIPE_OK)
@@ -309,9 +309,9 @@ svga_rebind_framebuffer_bindings(struct svga_context *svga)
       }
    }
 
-   if (hw->zsbuf) {
+   if (hw->dsv) {
       ret = svga->swc->resource_rebind(svga->swc,
-                                       svga_surface(hw->zsbuf)->handle,
+                                       svga_surface(hw->dsv)->handle,
                                        NULL,
                                        SVGA_RELOC_WRITE);
       if (ret != PIPE_OK)