summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robclark@freedesktop.org>2014-10-21 12:25:28 -0400
committerEmil Velikov <emil.l.velikov@gmail.com>2014-10-29 17:46:36 +0000
commit69ac2043cf4de3b71a9ecd12ca767449e53ff3fe (patch)
tree8255996f55c5b0a31ea59063a9a6c4a219e5fefd
parenteaff221c9cea778689166c8645b947a764c0268b (diff)
freedreno/a3xx: fix viewport state during clear
Signed-off-by: Rob Clark <robclark@freedesktop.org> (cherry picked from commit 2bc2ab66d9c06477cdec6799c24733fbd2d4db3f)
-rw-r--r--src/gallium/drivers/freedreno/a3xx/fd3_draw.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
index 7cc24e598e2..c4e3d8dffe2 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
@@ -151,6 +151,22 @@ fd3_draw(struct fd_context *ctx, const struct pipe_draw_info *info)
draw_impl(ctx, ctx->ring, &emit);
}
+/* clear operations ignore viewport state, so we need to reset it
+ * based on framebuffer state:
+ */
+static void
+reset_viewport(struct fd_ringbuffer *ring, struct pipe_framebuffer_state *pfb)
+{
+ float half_width = pfb->width * 0.5f;
+ float half_height = pfb->height * 0.5f;
+
+ OUT_PKT0(ring, REG_A3XX_GRAS_CL_VPORT_XOFFSET, 4);
+ OUT_RING(ring, A3XX_GRAS_CL_VPORT_XOFFSET(half_width - 0.5));
+ OUT_RING(ring, A3XX_GRAS_CL_VPORT_XSCALE(half_width));
+ OUT_RING(ring, A3XX_GRAS_CL_VPORT_YOFFSET(half_height - 0.5));
+ OUT_RING(ring, A3XX_GRAS_CL_VPORT_YSCALE(-half_height));
+}
+
/* binning pass cmds for a clear:
* NOTE: newer blob drivers don't use binning for clear, which is probably
* preferable since it is low vtx count. However that doesn't seem to
@@ -176,6 +192,7 @@ fd3_clear_binning(struct fd_context *ctx, unsigned dirty)
fd3_emit_state(ctx, ring, &emit);
fd3_emit_vertex_bufs(ring, &emit);
+ reset_viewport(ring, &ctx->framebuffer);
OUT_PKT0(ring, REG_A3XX_PC_PRIM_VTX_CNTL, 1);
OUT_RING(ring, A3XX_PC_PRIM_VTX_CNTL_STRIDE_IN_VPC(0) |
@@ -212,7 +229,7 @@ fd3_clear(struct fd_context *ctx, unsigned buffers,
},
};
- dirty &= FD_DIRTY_VIEWPORT | FD_DIRTY_FRAMEBUFFER | FD_DIRTY_SCISSOR;
+ dirty &= FD_DIRTY_FRAMEBUFFER | FD_DIRTY_SCISSOR;
dirty |= FD_DIRTY_PROG;
emit.dirty = dirty;
@@ -220,6 +237,7 @@ fd3_clear(struct fd_context *ctx, unsigned buffers,
/* emit generic state now: */
fd3_emit_state(ctx, ring, &emit);
+ reset_viewport(ring, &ctx->framebuffer);
OUT_PKT0(ring, REG_A3XX_RB_BLEND_ALPHA, 1);
OUT_RING(ring, A3XX_RB_BLEND_ALPHA_UINT(0xff) |