[Mesa-dev] [PATCH 37/40] i965: Set all the supported scissor rectangles for GEN7

Kenneth Graunke kenneth at whitecape.org
Fri Jan 10 18:20:37 PST 2014


On 01/10/2014 05:40 PM, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> Currently MaxViewports is still 1, so this won't affect any change.
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/mesa/drivers/dri/i965/gen6_scissor_state.c | 61 ++++++++++++++------------
>  1 file changed, 34 insertions(+), 27 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/gen6_scissor_state.c b/src/mesa/drivers/dri/i965/gen6_scissor_state.c
> index 7b92b7c..c8438e0 100644
> --- a/src/mesa/drivers/dri/i965/gen6_scissor_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_scissor_state.c
> @@ -30,6 +30,7 @@
>  #include "brw_defines.h"
>  #include "intel_batchbuffer.h"
>  #include "main/fbobject.h"
> +#include "main/framebuffer.h"
>  
>  static void
>  gen6_upload_scissor_state(struct brw_context *brw)
> @@ -40,7 +41,8 @@ gen6_upload_scissor_state(struct brw_context *brw)
>     uint32_t scissor_state_offset;
>  
>     scissor = brw_state_batch(brw, AUB_TRACE_SCISSOR_STATE,
> -			     sizeof(*scissor), 32, &scissor_state_offset);
> +			     sizeof(*scissor) * ctx->Const.MaxViewports, 32,
> +                             &scissor_state_offset);
>  
>     /* _NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT */
>  
> @@ -51,33 +53,38 @@ gen6_upload_scissor_state(struct brw_context *brw)
>      * Note that the hardware's coordinates are inclusive, while Mesa's min is
>      * inclusive but max is exclusive.
>      */
> -   if (ctx->DrawBuffer->_Xmin == ctx->DrawBuffer->_Xmax ||
> -       ctx->DrawBuffer->_Ymin == ctx->DrawBuffer->_Ymax) {
> -      /* 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->xmin = 1;
> -      scissor->xmax = 0;
> -      scissor->ymin = 1;
> -      scissor->ymax = 0;
> -   } else if (render_to_fbo) {
> -      /* texmemory: Y=0=bottom */
> -      scissor->xmin = ctx->DrawBuffer->_Xmin;
> -      scissor->xmax = ctx->DrawBuffer->_Xmax - 1;
> -      scissor->ymin = ctx->DrawBuffer->_Ymin;
> -      scissor->ymax = ctx->DrawBuffer->_Ymax - 1;
> -   }
> -   else {
> -      /* memory: Y=0=top */
> -      scissor->xmin = ctx->DrawBuffer->_Xmin;
> -      scissor->xmax = ctx->DrawBuffer->_Xmax - 1;
> -      scissor->ymin = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymax;
> -      scissor->ymax = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymin - 1;
> -   }
> +   for (unsigned i = 0; i < ctx->Const.MaxViewports; i++) {
> +      int bbox[4];
>  
> +      _mesa_scissor_bounding_box(ctx, ctx->DrawBuffer, i, bbox);
> +
> +      if (bbox[0] == bbox[1] ||
> +          bbox[2] == bbox[3]) {

May as well put these on one line...

      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[i].xmin = 1;
> +         scissor[i].xmax = 0;
> +         scissor[i].ymin = 1;
> +         scissor[i].ymax = 0;
> +      } else if (render_to_fbo) {
> +         /* texmemory: Y=0=bottom */
> +         scissor[i].xmin = bbox[0];
> +         scissor[i].xmax = bbox[1] - 1;
> +         scissor[i].ymin = bbox[2];
> +         scissor[i].ymax = bbox[3] - 1;
> +      }
> +      else {
> +         /* memory: Y=0=top */
> +         scissor[i].xmin = bbox[0];
> +         scissor[i].xmax = bbox[1] - 1;
> +         scissor[i].ymin = ctx->DrawBuffer->Height - bbox[3];
> +         scissor[i].ymax = ctx->DrawBuffer->Height - bbox[2] - 1;
> +      }
> +   }
>     BEGIN_BATCH(2);
>     OUT_BATCH(_3DSTATE_SCISSOR_STATE_POINTERS << 16 | (2 - 2));
>     OUT_BATCH(scissor_state_offset);
> 



More information about the mesa-dev mailing list