[Mesa-dev] [PATCH] radeonsi: do per-pixel clipping based on viewport states

Nicolai Hähnle nhaehnle at gmail.com
Thu Apr 7 21:56:10 UTC 2016


On 07.04.2016 14:17, Marek Olšák wrote:
> On Thu, Apr 7, 2016 at 7:56 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
>> On 06.04.2016 19:06, Marek Olšák wrote:
>>>
>>> From: Marek Olšák <marek.olsak at 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
>


More information about the mesa-dev mailing list