[Mesa-dev] [PATCH 3/4] util/blitter: make sure the blitter can restore all viewports

Zack Rusin zackr at vmware.com
Thu May 23 13:33:42 PDT 2013


in case a driver supports multiple viewports the blitter needs
to be able to restore all of them and not just the first one.

Signed-off-by: Zack Rusin <zackr at vmware.com>
---
 src/gallium/auxiliary/util/u_blitter.c             |    6 +++--
 src/gallium/auxiliary/util/u_blitter.h             |   24 +++++++++++++-------
 src/gallium/drivers/freedreno/freedreno_resource.c |    4 ++--
 src/gallium/drivers/i915/i915_surface.c            |    4 ++--
 src/gallium/drivers/ilo/ilo_blit.c                 |    2 +-
 src/gallium/drivers/llvmpipe/lp_surface.c          |    4 ++--
 src/gallium/drivers/nv30/nv30_miptree.c            |    4 ++--
 src/gallium/drivers/r300/r300_blit.c               |    4 ++--
 src/gallium/drivers/r600/r600_blit.c               |    4 ++--
 src/gallium/drivers/radeonsi/r600_blit.c           |    2 +-
 src/gallium/drivers/softpipe/sp_surface.c          |    4 ++--
 src/gallium/drivers/svga/svga_pipe_blit.c          |    4 ++--
 12 files changed, 38 insertions(+), 28 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
index e985376..8274b79 100644
--- a/src/gallium/auxiliary/util/u_blitter.c
+++ b/src/gallium/auxiliary/util/u_blitter.c
@@ -504,7 +504,8 @@ static void blitter_restore_fragment_states(struct blitter_context_priv *ctx)
    /* XXX check whether these are saved and whether they need to be restored
     * (depending on the operation) */
    pipe->set_stencil_ref(pipe, &ctx->base.saved_stencil_ref);
-   pipe->set_viewport_states(pipe, 1, &ctx->base.saved_viewport);
+   pipe->set_viewport_states(pipe, ctx->base.num_saved_viewports,
+                             ctx->base.saved_viewports);
 }
 
 static void blitter_check_saved_fb_state(struct blitter_context_priv *ctx)
@@ -1496,7 +1497,8 @@ void util_blitter_blit_generic(struct blitter_context *blitter,
    blitter_restore_textures(ctx);
    blitter_restore_fb_state(ctx);
    if (scissor) {
-      pipe->set_scissor_states(pipe, 1, &ctx->base.saved_scissor);
+      pipe->set_scissor_states(pipe, ctx->base.num_saved_scissors,
+                               ctx->base.saved_scissors);
    }
    blitter_restore_render_cond(ctx);
    blitter_unset_running_flag(ctx);
diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h
index 1901584..5d4296a 100644
--- a/src/gallium/auxiliary/util/u_blitter.h
+++ b/src/gallium/auxiliary/util/u_blitter.h
@@ -106,8 +106,10 @@ struct blitter_context
 
    struct pipe_framebuffer_state saved_fb_state;  /**< framebuffer state */
    struct pipe_stencil_ref saved_stencil_ref;     /**< stencil ref */
-   struct pipe_viewport_state saved_viewport;
-   struct pipe_scissor_state saved_scissor;
+   struct pipe_viewport_state saved_viewports[PIPE_MAX_VIEWPORTS];
+   unsigned num_saved_viewports;
+   struct pipe_scissor_state saved_scissors[PIPE_MAX_VIEWPORTS];
+   unsigned num_saved_scissors;
    boolean is_sample_mask_saved;
    unsigned saved_sample_mask;
 
@@ -442,17 +444,23 @@ void util_blitter_save_framebuffer(struct blitter_context *blitter,
 }
 
 static INLINE
-void util_blitter_save_viewport(struct blitter_context *blitter,
-                                struct pipe_viewport_state *state)
+void util_blitter_save_viewports(struct blitter_context *blitter,
+                                 unsigned num_viewports,
+                                 struct pipe_viewport_state *states)
 {
-   blitter->saved_viewport = *state;
+   blitter->num_saved_viewports = num_viewports;
+   memcpy(blitter->saved_viewports, states,
+          sizeof(struct pipe_viewport_state) * num_viewports);
 }
 
 static INLINE
-void util_blitter_save_scissor(struct blitter_context *blitter,
-                               struct pipe_scissor_state *state)
+void util_blitter_save_scissors(struct blitter_context *blitter,
+                               unsigned num_scissors,
+                               struct pipe_scissor_state *states)
 {
-   blitter->saved_scissor = *state;
+   blitter->num_saved_scissors = num_scissors;
+   memcpy(blitter->saved_scissors, states,
+          sizeof(struct pipe_viewport_state) * num_scissors);
 }
 
 static INLINE
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 00f3db8..7a0c68d 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -254,8 +254,8 @@ fd_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
 	util_blitter_save_vertex_elements(ctx->blitter, ctx->vtx);
 	util_blitter_save_vertex_shader(ctx->blitter, ctx->prog.vp);
 	util_blitter_save_rasterizer(ctx->blitter, ctx->rasterizer);
-	util_blitter_save_viewport(ctx->blitter, &ctx->viewport);
-	util_blitter_save_scissor(ctx->blitter, &ctx->scissor);
+	util_blitter_save_viewports(ctx->blitter, 1, &ctx->viewport);
+	util_blitter_save_scissors(ctx->blitter, 1, &ctx->scissor);
 	util_blitter_save_fragment_shader(ctx->blitter, ctx->prog.fp);
 	util_blitter_save_blend(ctx->blitter, ctx->blend);
 	util_blitter_save_depth_stencil_alpha(ctx->blitter, ctx->zsa);
diff --git a/src/gallium/drivers/i915/i915_surface.c b/src/gallium/drivers/i915/i915_surface.c
index b8eef89..e46f90d 100644
--- a/src/gallium/drivers/i915/i915_surface.c
+++ b/src/gallium/drivers/i915/i915_surface.c
@@ -52,8 +52,8 @@ i915_util_blitter_save_states(struct i915_context *i915)
    util_blitter_save_rasterizer(i915->blitter, (void *)i915->rasterizer);
    util_blitter_save_fragment_shader(i915->blitter, i915->fs);
    util_blitter_save_vertex_shader(i915->blitter, i915->vs);
-   util_blitter_save_viewport(i915->blitter, &i915->viewport);
-   util_blitter_save_scissor(i915->blitter, &i915->scissor);
+   util_blitter_save_viewports(i915->blitter, 1, &i915->viewport);
+   util_blitter_save_scissors(i915->blitter, 1, &i915->scissor);
    util_blitter_save_vertex_elements(i915->blitter, i915->velems);
    util_blitter_save_vertex_buffer_slot(i915->blitter,
                                     i915->vertex_buffers);
diff --git a/src/gallium/drivers/ilo/ilo_blit.c b/src/gallium/drivers/ilo/ilo_blit.c
index e3fd67c..e787861 100644
--- a/src/gallium/drivers/ilo/ilo_blit.c
+++ b/src/gallium/drivers/ilo/ilo_blit.c
@@ -135,7 +135,7 @@ ilo_blitter_begin(struct ilo_context *ilo, enum ilo_blitter_op op)
    util_blitter_save_blend(ilo->blitter, ilo->blend);
 
    /* undocumented? */
-   util_blitter_save_viewport(ilo->blitter, &ilo->viewport);
+   util_blitter_save_viewports(ilo->blitter, 1, &ilo->viewport);
    util_blitter_save_stencil_ref(ilo->blitter, &ilo->stencil_ref);
    util_blitter_save_sample_mask(ilo->blitter, ilo->sample_mask);
 
diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c
index 5e6a6eb..036b129 100644
--- a/src/gallium/drivers/llvmpipe/lp_surface.c
+++ b/src/gallium/drivers/llvmpipe/lp_surface.c
@@ -214,8 +214,8 @@ static void lp_blit(struct pipe_context *pipe,
    util_blitter_save_so_targets(lp->blitter, lp->num_so_targets,
                                 (struct pipe_stream_output_target**)lp->so_targets);
    util_blitter_save_rasterizer(lp->blitter, (void*)lp->rasterizer);
-   util_blitter_save_viewport(lp->blitter, &lp->viewport);
-   util_blitter_save_scissor(lp->blitter, &lp->scissor);
+   util_blitter_save_viewports(lp->blitter, 1, &lp->viewport);
+   util_blitter_save_scissors(lp->blitter, 1, &lp->scissor);
    util_blitter_save_fragment_shader(lp->blitter, lp->fs);
    util_blitter_save_blend(lp->blitter, (void*)lp->blend);
    util_blitter_save_depth_stencil_alpha(lp->blitter, (void*)lp->depth_stencil);
diff --git a/src/gallium/drivers/nv30/nv30_miptree.c b/src/gallium/drivers/nv30/nv30_miptree.c
index 4f5c445..327b170 100644
--- a/src/gallium/drivers/nv30/nv30_miptree.c
+++ b/src/gallium/drivers/nv30/nv30_miptree.c
@@ -198,8 +198,8 @@ nv30_blit(struct pipe_context *pipe,
    util_blitter_save_vertex_elements(nv30->blitter, nv30->vertex);
    util_blitter_save_vertex_shader(nv30->blitter, nv30->vertprog.program);
    util_blitter_save_rasterizer(nv30->blitter, nv30->rast);
-   util_blitter_save_viewport(nv30->blitter, &nv30->viewport);
-   util_blitter_save_scissor(nv30->blitter, &nv30->scissor);
+   util_blitter_save_viewports(nv30->blitter, 1, &nv30->viewport);
+   util_blitter_save_scissors(nv30->blitter, 1, &nv30->scissor);
    util_blitter_save_fragment_shader(nv30->blitter, nv30->fragprog.program);
    util_blitter_save_blend(nv30->blitter, nv30->blend);
    util_blitter_save_depth_stencil_alpha(nv30->blitter,
diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c
index 76f8327..a5f0b61 100644
--- a/src/gallium/drivers/r300/r300_blit.c
+++ b/src/gallium/drivers/r300/r300_blit.c
@@ -66,8 +66,8 @@ static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op o
     util_blitter_save_rasterizer(r300->blitter, r300->rs_state.state);
     util_blitter_save_fragment_shader(r300->blitter, r300->fs.state);
     util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state);
-    util_blitter_save_viewport(r300->blitter, &r300->viewport);
-    util_blitter_save_scissor(r300->blitter, r300->scissor_state.state);
+    util_blitter_save_viewports(r300->blitter, 1, &r300->viewport);
+    util_blitter_save_scissors(r300->blitter, 1, r300->scissor_state.state);
     util_blitter_save_sample_mask(r300->blitter, *(unsigned*)r300->sample_mask.state);
     util_blitter_save_vertex_buffer_slot(r300->blitter, r300->vertex_buffer);
     util_blitter_save_vertex_elements(r300->blitter, r300->velems);
diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index 058bf81..db50c63 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -63,8 +63,8 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
 	util_blitter_save_rasterizer(rctx->blitter, rctx->rasterizer_state.cso);
 
 	if (op & R600_SAVE_FRAGMENT_STATE) {
-		util_blitter_save_viewport(rctx->blitter, &rctx->viewport.state);
-		util_blitter_save_scissor(rctx->blitter, &rctx->scissor.scissor);
+		util_blitter_save_viewports(rctx->blitter, 1, &rctx->viewport.state);
+		util_blitter_save_scissors(rctx->blitter, 1, &rctx->scissor.scissor);
 		util_blitter_save_fragment_shader(rctx->blitter, rctx->ps_shader);
 		util_blitter_save_blend(rctx->blitter, rctx->blend_state.cso);
 		util_blitter_save_depth_stencil_alpha(rctx->blitter, rctx->dsa_state.cso);
diff --git a/src/gallium/drivers/radeonsi/r600_blit.c b/src/gallium/drivers/radeonsi/r600_blit.c
index f11f110..73c862a 100644
--- a/src/gallium/drivers/radeonsi/r600_blit.c
+++ b/src/gallium/drivers/radeonsi/r600_blit.c
@@ -59,7 +59,7 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
 	util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader);
 	util_blitter_save_vertex_elements(rctx->blitter, rctx->vertex_elements);
 	if (rctx->queued.named.viewport) {
-		util_blitter_save_viewport(rctx->blitter, &rctx->queued.named.viewport->viewport);
+		util_blitter_save_viewports(rctx->blitter, 1, &rctx->queued.named.viewport->viewport);
 	}
 	util_blitter_save_vertex_buffer_slot(rctx->blitter, rctx->vertex_buffer);
 	util_blitter_save_so_targets(rctx->blitter, rctx->num_so_targets,
diff --git a/src/gallium/drivers/softpipe/sp_surface.c b/src/gallium/drivers/softpipe/sp_surface.c
index 911c34d..98b2ff2 100644
--- a/src/gallium/drivers/softpipe/sp_surface.c
+++ b/src/gallium/drivers/softpipe/sp_surface.c
@@ -63,8 +63,8 @@ static void sp_blit(struct pipe_context *pipe,
    util_blitter_save_so_targets(sp->blitter, sp->num_so_targets,
                      (struct pipe_stream_output_target**)sp->so_targets);
    util_blitter_save_rasterizer(sp->blitter, sp->rasterizer);
-   util_blitter_save_viewport(sp->blitter, &sp->viewport);
-   util_blitter_save_scissor(sp->blitter, &sp->scissor);
+   util_blitter_save_viewports(sp->blitter, 1, &sp->viewport);
+   util_blitter_save_scissors(sp->blitter, 1, &sp->scissor);
    util_blitter_save_fragment_shader(sp->blitter, sp->fs);
    util_blitter_save_blend(sp->blitter, sp->blend);
    util_blitter_save_depth_stencil_alpha(sp->blitter, sp->depth_stencil);
diff --git a/src/gallium/drivers/svga/svga_pipe_blit.c b/src/gallium/drivers/svga/svga_pipe_blit.c
index a44ed12..9571a84 100644
--- a/src/gallium/drivers/svga/svga_pipe_blit.c
+++ b/src/gallium/drivers/svga/svga_pipe_blit.c
@@ -190,8 +190,8 @@ static void svga_blit(struct pipe_context *pipe,
    /*util_blitter_save_so_targets(svga->blitter, svga->num_so_targets,
                      (struct pipe_stream_output_target**)svga->so_targets);*/
    util_blitter_save_rasterizer(svga->blitter, (void*)svga->curr.rast);
-   util_blitter_save_viewport(svga->blitter, &svga->curr.viewport);
-   util_blitter_save_scissor(svga->blitter, &svga->curr.scissor);
+   util_blitter_save_viewports(svga->blitter, 1, &svga->curr.viewport);
+   util_blitter_save_scissors(svga->blitter, 1, &svga->curr.scissor);
    util_blitter_save_fragment_shader(svga->blitter, svga->curr.fs);
    util_blitter_save_blend(svga->blitter, (void*)svga->curr.blend);
    util_blitter_save_depth_stencil_alpha(svga->blitter,
-- 
1.7.10.4


More information about the mesa-dev mailing list