On 01/10/2014 05:40 PM, Ian Romanick wrote: > From: Ian Romanick <ian.d.roman...@intel.com> > > Currently MaxViewports is still 1, so this won't affect any change. > > Signed-off-by: Ian Romanick <ian.d.roman...@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); > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev