[Mesa-dev] [PATCH v02 32/37] i965: Port gen6+ 3DSTATE_SCISSOR_STATE_POINTERS to use genxml.

Kenneth Graunke kenneth at whitecape.org
Thu Apr 27 07:43:13 UTC 2017


On Monday, April 24, 2017 3:19:27 PM PDT Rafael Antognolli wrote:
> diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
> index 45b02a6..3ad9707 100644
> --- a/src/mesa/drivers/dri/i965/genX_state_upload.c
> +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
> @@ -1651,6 +1651,89 @@ static const struct brw_tracked_state genX(blend_state) = {
>     .emit = genX(upload_blend_state),
>  };
>  
> +/* ---------------------------------------------------------------------- */
> +
> +static void
> +genX(upload_scissor_state)(struct brw_context *brw)
> +{
> +   struct gl_context *ctx = &brw->ctx;
> +   const bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
> +   struct GENX(SCISSOR_RECT) scissor;
> +   uint32_t scissor_state_offset;
> +   const unsigned int fb_width= _mesa_geometric_width(ctx->DrawBuffer);

                                ^^ space before =

> +   const unsigned int fb_height = _mesa_geometric_height(ctx->DrawBuffer);
> +   uint32_t *scissor_map;
> +
> +   /* BRW_NEW_VIEWPORT_COUNT */
> +   const unsigned viewport_count = brw->clip.viewport_count;
> +
> +   scissor_map = brw_state_batch(
> +      brw, GENX(SCISSOR_RECT_length) * sizeof(uint32_t) * viewport_count,
> +      32, &scissor_state_offset);
> +
> +   /* _NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT */
> +
> +   /* The scissor only needs to handle the intersection of drawable and
> +    * scissor rect.  Clipping to the boundaries of static shared buffers
> +    * for front/back/depth is covered by looping over cliprects in brw_draw.c.
> +    *
> +    * Note that the hardware's coordinates are inclusive, while Mesa's min is
> +    * inclusive but max is exclusive.
> +    */
> +   for (unsigned i = 0; i < viewport_count; i++) {
> +      int bbox[4];
> +
> +      bbox[0] = MAX2(ctx->ViewportArray[i].X, 0);
> +      bbox[1] = MIN2(bbox[0] + ctx->ViewportArray[i].Width, fb_width);
> +      bbox[2] = MAX2(ctx->ViewportArray[i].Y, 0);
> +      bbox[3] = MIN2(bbox[2] + ctx->ViewportArray[i].Height, fb_height);
> +      _mesa_intersect_scissor_bounding_box(ctx, i, bbox);
> +
> +      if (bbox[0] == bbox[1] || bbox[2] == bbox[3]) {
> +         /* If the scissor was out of bounds and got clamped to 0 width/height
> +          * at the bounds, the subtraction of 1 from maximums could produce a
> +          * negative number and thus not clip anything.  Instead, just provide
> +          * a min > max scissor inside the bounds, which produces the expected
> +          * no rendering.
> +          */
> +         scissor.ScissorRectangleXMin = 1;
> +         scissor.ScissorRectangleXMax = 0;
> +         scissor.ScissorRectangleYMin = 1;
> +         scissor.ScissorRectangleYMax = 0;
> +      } else if (render_to_fbo) {
> +         /* texmemory: Y=0=bottom */
> +         scissor.ScissorRectangleXMin = bbox[0];
> +         scissor.ScissorRectangleXMax = bbox[1] - 1;
> +         scissor.ScissorRectangleYMin = bbox[2];
> +         scissor.ScissorRectangleYMax = bbox[3] - 1;
> +      } else {
> +         /* memory: Y=0=top */
> +         scissor.ScissorRectangleXMin = bbox[0];
> +         scissor.ScissorRectangleXMax = bbox[1] - 1;
> +         scissor.ScissorRectangleYMin = fb_height - bbox[3];
> +         scissor.ScissorRectangleYMax = fb_height - bbox[2] - 1;
> +      }
> +
> +      GENX(SCISSOR_RECT_pack)(NULL, scissor_map + i * 2, &scissor);

Maybe i * GENX(SCISSOR_RECT_length) ?

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170427/e466bbe6/attachment.sig>


More information about the mesa-dev mailing list