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 <kenn...@whitecape.org>
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev