diff options
author | Ian Romanick <[email protected]> | 2013-11-06 09:11:08 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2014-01-20 11:31:59 -0800 |
commit | 6d3b1dc150e4bdd462b5320a072e509777ad386a (patch) | |
tree | 8295de61b3cf72ec85c23385b8ab7247ddcacd64 | |
parent | 454cec429969b7f09eeff17a5d1e7584d36f017f (diff) |
mesa: Set all scissor rects
In _mesa_Scissor, make sure that ctx->Driver.Scissor is only called once
instead of once per scissor rectangle.
v2: Use MAX_VIEWPORTS instead of ctx->Const.MaxViewports because the
driver may not set ctx->Const.MaxViewports yet.
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/mesa/main/context.c | 2 | ||||
-rw-r--r-- | src/mesa/main/scissor.c | 30 |
2 files changed, 28 insertions, 4 deletions
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 1cd006416e1..807812955d1 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1448,8 +1448,8 @@ _mesa_check_init_viewport(struct gl_context *ctx, GLuint width, GLuint height) */ for (i = 0; i < MAX_VIEWPORTS; i++) { _mesa_set_viewport(ctx, i, 0, 0, width, height); + _mesa_set_scissor(ctx, i, 0, 0, width, height); } - _mesa_set_scissor(ctx, 0, 0, 0, width, height); } } diff --git a/src/mesa/main/scissor.c b/src/mesa/main/scissor.c index 9266f1e9810..9caac2e4254 100644 --- a/src/mesa/main/scissor.c +++ b/src/mesa/main/scissor.c @@ -60,6 +60,7 @@ set_scissor_no_notify(struct gl_context *ctx, unsigned idx, void GLAPIENTRY _mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height ) { + unsigned i; GET_CURRENT_CONTEXT(ctx); if (MESA_VERBOSE & VERBOSE_API) @@ -70,7 +71,23 @@ _mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height ) return; } - _mesa_set_scissor(ctx, 0, x, y, width, height); + /* The GL_ARB_viewport_array spec says: + * + * "Scissor sets the scissor rectangle for all viewports to the same + * values and is equivalent (assuming no errors are generated) to: + * + * for (uint i = 0; i < MAX_VIEWPORTS; i++) { + * ScissorIndexed(i, left, bottom, width, height); + * }" + * + * Set the scissor rectangle for all of the viewports supported by the + * implementation, but only signal the driver once at the end. + */ + for (i = 0; i < ctx->Const.MaxViewports; i++) + set_scissor_no_notify(ctx, i, x, y, width, height); + + if (ctx->Driver.Scissor) + ctx->Driver.Scissor(ctx); } @@ -105,7 +122,14 @@ _mesa_set_scissor(struct gl_context *ctx, unsigned idx, void _mesa_init_scissor(struct gl_context *ctx) { + unsigned i; + /* Scissor group */ - ctx->Scissor.EnableFlags = GL_FALSE; - set_scissor_no_notify(ctx, 0, 0, 0, 0, 0); + ctx->Scissor.EnableFlags = 0; + + /* Note: ctx->Const.MaxViewports may not have been set by the driver yet, + * so just initialize all of them. + */ + for (i = 0; i < MAX_VIEWPORTS; i++) + set_scissor_no_notify(ctx, i, 0, 0, 0, 0); } |