On 07.04.2016 14:17, Marek Olšák wrote:
On Thu, Apr 7, 2016 at 7:56 PM, Nicolai Hähnle <nhaeh...@gmail.com> wrote:
On 06.04.2016 19:06, Marek Olšák wrote:

From: Marek Olšák <marek.ol...@amd.com>

In other words, vport scissors are derived from viewport states.
If the scissor test is enabled, the intersection of both is used.

The guard band will disable clipping, so we have to clip per-pixel.
---
   src/gallium/drivers/radeonsi/si_state.c | 95
+++++++++++++++++++++++++++++----
   src/gallium/drivers/radeonsi/si_state.h |  1 +
   2 files changed, 85 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state.c
b/src/gallium/drivers/radeonsi/si_state.c
index 10d691a..462dc63 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -830,25 +830,93 @@ static void si_set_scissor_states(struct
pipe_context *ctx,
         for (i = 0; i < num_scissors; i++)
                 sctx->scissors.states[start_slot + i] = state[i];

+       if (!sctx->queued.named.rasterizer ||
+           !sctx->queued.named.rasterizer->scissor_enable)
+               return;
+
         sctx->scissors.dirty_mask |= ((1 << num_scissors) - 1) <<
start_slot;
         si_mark_atom_dirty(sctx, &sctx->scissors.atom);
   }

+static void si_get_scissor_from_viewport(struct pipe_viewport_state *vp,
+                                        struct pipe_scissor_state
*scissor)
+{
+       /* These must be signed, unlike pipe_scissor_state. */
+       int minx, miny, maxx, maxy, tmp;
+
+       /* Convert (-1, -1) and (1, 1) from clip space into window space.
*/
+       minx = -vp->scale[0] + vp->translate[0];
+       miny = -vp->scale[1] + vp->translate[1];
+       maxx = vp->scale[0] + vp->translate[0];
+       maxy = vp->scale[1] + vp->translate[1];
+
+       /* r600_draw_rectangle sets this. Disable the scissor. */
+       if (minx == -1 && miny == -1 && maxx == 1 && maxy == 1) {
+               minx = miny = 0;
+               maxx = maxy = 16384;
+       }
+
+       /* Handle inverted viewports. */
+       if (minx > maxx) {
+               tmp = minx;
+               minx = maxx;
+               maxx = tmp;
+       }
+       if (miny > maxy) {
+               tmp = miny;
+               miny = maxy;
+               maxy = tmp;
+       }
+
+       scissor->minx = CLAMP(minx, 0, 16384);
+       scissor->miny = CLAMP(miny, 0, 16384);
+       scissor->maxx = CLAMP(maxx, 0, 16384);
+       scissor->maxy = CLAMP(maxy, 0, 16384);


I believe these should be 16383 (also above).

The maximum value for VPORT_SCISSOR is really 16384. not 16383.

I misread, sorry. You're right.

Marek

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to