diff options
author | Dave Airlie <[email protected]> | 2009-08-27 15:36:35 +1000 |
---|---|---|
committer | Dave Airlie <airlied@itt42.(none)> | 2009-08-27 15:38:00 +1000 |
commit | 82ff3190de3cd6cf4a514bac00ae02597abfb963 (patch) | |
tree | f7a5a70b0b5eed43e6449f3436f9de35d7e48234 /src/mesa | |
parent | 09c73c74376ed6b12e343c89b4eac94285439860 (diff) |
radeon: fix scissor calcs.
For non-FBOs we need to invert, for FBOs the scissors are non-inverted.
no matter what we need to clamp them to the buffer sizes.
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_common.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/mesa/drivers/dri/radeon/radeon_common.c b/src/mesa/drivers/dri/radeon/radeon_common.c index 0894372fad1..bed75f3d733 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common.c +++ b/src/mesa/drivers/dri/radeon/radeon_common.c @@ -231,26 +231,31 @@ void radeonSetCliprects(radeonContextPtr radeon) void radeonUpdateScissor( GLcontext *ctx ) { radeonContextPtr rmesa = RADEON_CONTEXT(ctx); + GLint x = ctx->Scissor.X, y = ctx->Scissor.Y; + GLsizei w = ctx->Scissor.Width, h = ctx->Scissor.Height; + int x1, y1, x2, y2; - if ( !ctx->DrawBuffer->Name ) { - __DRIdrawablePrivate *dPriv = radeon_get_drawable(rmesa); - - int x = ctx->Scissor.X; - int y = dPriv->h - ctx->Scissor.Y - ctx->Scissor.Height; - int w = ctx->Scissor.X + ctx->Scissor.Width - 1; - int h = dPriv->h - ctx->Scissor.Y - 1; + if (!ctx->DrawBuffer) + return; - rmesa->state.scissor.rect.x1 = x + dPriv->x; - rmesa->state.scissor.rect.y1 = y + dPriv->y; - rmesa->state.scissor.rect.x2 = w + dPriv->x + 1; - rmesa->state.scissor.rect.y2 = h + dPriv->y + 1; + if ( !ctx->DrawBuffer->Name ) { + x1 = x; + y1 = ctx->DrawBuffer->Height - (y + h); + x2 = x + w - 1; + y2 = y1 + h - 1; } else { - rmesa->state.scissor.rect.x1 = ctx->Scissor.X; - rmesa->state.scissor.rect.y1 = ctx->Scissor.Y; - rmesa->state.scissor.rect.x2 = ctx->Scissor.X + ctx->Scissor.Width; - rmesa->state.scissor.rect.y2 = ctx->Scissor.Y + ctx->Scissor.Height; + x1 = x; + y1 = y; + x2 = x + w - 1; + y2 = y + h - 1; + } + rmesa->state.scissor.rect.x1 = CLAMP(x1, 0, ctx->DrawBuffer->Width - 1); + rmesa->state.scissor.rect.y1 = CLAMP(y1, 0, ctx->DrawBuffer->Height - 1); + rmesa->state.scissor.rect.x2 = CLAMP(x2, 0, ctx->DrawBuffer->Width - 1); + rmesa->state.scissor.rect.y2 = CLAMP(y2, 0, ctx->DrawBuffer->Height - 1); + radeonRecalcScissorRects( rmesa ); } |