mesa: Update gl_scissor_attrib to support ARB_viewport_array
Update Mesa and drivers to access updated gl_scissor_attrib. Now have an enable bitfield and array of gl_scissor_rects. Drivers have been updated to the new scissor enable state attribute (gl_context.scissor.EnableFlags) but still treat it as a single boolean which is okay as mesa will only use bit 0 when communicating with a driver that does not support ARB_viewport_array. v2 (idr): Rebase fixes. v3 (idr): Small code formatting fix suggsted by Ken. Signed-off-by: Courtney Goeltzenleuchter <courtney@LunarG.com> Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:

committed by
Ian Romanick

parent
1f59e963b4
commit
a9c73fb778
@@ -274,7 +274,7 @@ _mesa_init_driver_state(struct gl_context *ctx)
|
|||||||
ctx->Driver.Enable(ctx, GL_LIGHTING, ctx->Light.Enabled);
|
ctx->Driver.Enable(ctx, GL_LIGHTING, ctx->Light.Enabled);
|
||||||
ctx->Driver.Enable(ctx, GL_LINE_SMOOTH, ctx->Line.SmoothFlag);
|
ctx->Driver.Enable(ctx, GL_LINE_SMOOTH, ctx->Line.SmoothFlag);
|
||||||
ctx->Driver.Enable(ctx, GL_POLYGON_STIPPLE, ctx->Polygon.StippleFlag);
|
ctx->Driver.Enable(ctx, GL_POLYGON_STIPPLE, ctx->Polygon.StippleFlag);
|
||||||
ctx->Driver.Enable(ctx, GL_SCISSOR_TEST, ctx->Scissor.Enabled);
|
ctx->Driver.Enable(ctx, GL_SCISSOR_TEST, ctx->Scissor.EnableFlags);
|
||||||
ctx->Driver.Enable(ctx, GL_STENCIL_TEST, ctx->Stencil._Enabled);
|
ctx->Driver.Enable(ctx, GL_STENCIL_TEST, ctx->Stencil._Enabled);
|
||||||
ctx->Driver.Enable(ctx, GL_TEXTURE_1D, GL_FALSE);
|
ctx->Driver.Enable(ctx, GL_TEXTURE_1D, GL_FALSE);
|
||||||
ctx->Driver.Enable(ctx, GL_TEXTURE_2D, GL_FALSE);
|
ctx->Driver.Enable(ctx, GL_TEXTURE_2D, GL_FALSE);
|
||||||
|
@@ -933,9 +933,9 @@ _mesa_meta_end(struct gl_context *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (state & MESA_META_SCISSOR) {
|
if (state & MESA_META_SCISSOR) {
|
||||||
_mesa_set_enable(ctx, GL_SCISSOR_TEST, save->Scissor.Enabled);
|
_mesa_set_enable(ctx, GL_SCISSOR_TEST, save->Scissor.EnableFlags);
|
||||||
_mesa_Scissor(save->Scissor.X, save->Scissor.Y,
|
_mesa_Scissor(save->Scissor.ScissorArray[0].X, save->Scissor.ScissorArray[0].Y,
|
||||||
save->Scissor.Width, save->Scissor.Height);
|
save->Scissor.ScissorArray[0].Width, save->Scissor.ScissorArray[0].Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state & MESA_META_SHADER) {
|
if (state & MESA_META_SHADER) {
|
||||||
|
@@ -536,23 +536,27 @@ i830Scissor(struct gl_context * ctx)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
DBG("%s %d,%d %dx%d\n", __FUNCTION__,
|
DBG("%s %d,%d %dx%d\n", __FUNCTION__,
|
||||||
ctx->Scissor.X, ctx->Scissor.Y,
|
ctx->Scissor.ScissorArray[0].X, ctx->Scissor.ScissorArray[0].Y,
|
||||||
ctx->Scissor.Width, ctx->Scissor.Height);
|
ctx->Scissor.ScissorArray[0].Width, ctx->Scissor.ScissorArray[0].Height);
|
||||||
|
|
||||||
if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) {
|
if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) {
|
||||||
x1 = ctx->Scissor.X;
|
x1 = ctx->Scissor.ScissorArray[0].X;
|
||||||
y1 = ctx->DrawBuffer->Height - (ctx->Scissor.Y + ctx->Scissor.Height);
|
y1 = ctx->DrawBuffer->Height - (ctx->Scissor.ScissorArray[0].Y
|
||||||
x2 = ctx->Scissor.X + ctx->Scissor.Width - 1;
|
+ ctx->Scissor.ScissorArray[0].Height);
|
||||||
y2 = y1 + ctx->Scissor.Height - 1;
|
x2 = ctx->Scissor.ScissorArray[0].X
|
||||||
|
+ ctx->Scissor.ScissorArray[0].Width - 1;
|
||||||
|
y2 = y1 + ctx->Scissor.ScissorArray[0].Height - 1;
|
||||||
DBG("%s %d..%d,%d..%d (inverted)\n", __FUNCTION__, x1, x2, y1, y2);
|
DBG("%s %d..%d,%d..%d (inverted)\n", __FUNCTION__, x1, x2, y1, y2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* FBO - not inverted
|
/* FBO - not inverted
|
||||||
*/
|
*/
|
||||||
x1 = ctx->Scissor.X;
|
x1 = ctx->Scissor.ScissorArray[0].X;
|
||||||
y1 = ctx->Scissor.Y;
|
y1 = ctx->Scissor.ScissorArray[0].Y;
|
||||||
x2 = ctx->Scissor.X + ctx->Scissor.Width - 1;
|
x2 = ctx->Scissor.ScissorArray[0].X
|
||||||
y2 = ctx->Scissor.Y + ctx->Scissor.Height - 1;
|
+ ctx->Scissor.ScissorArray[0].Width - 1;
|
||||||
|
y2 = ctx->Scissor.ScissorArray[0].Y
|
||||||
|
+ ctx->Scissor.ScissorArray[0].Height - 1;
|
||||||
DBG("%s %d..%d,%d..%d (not inverted)\n", __FUNCTION__, x1, x2, y1, y2);
|
DBG("%s %d..%d,%d..%d (not inverted)\n", __FUNCTION__, x1, x2, y1, y2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -510,23 +510,27 @@ i915Scissor(struct gl_context * ctx)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
DBG("%s %d,%d %dx%d\n", __FUNCTION__,
|
DBG("%s %d,%d %dx%d\n", __FUNCTION__,
|
||||||
ctx->Scissor.X, ctx->Scissor.Y,
|
ctx->Scissor.ScissorArray[0].X, ctx->Scissor.ScissorArray[0].Y,
|
||||||
ctx->Scissor.Width, ctx->Scissor.Height);
|
ctx->Scissor.ScissorArray[0].Width, ctx->Scissor.ScissorArray[0].Height);
|
||||||
|
|
||||||
if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) {
|
if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) {
|
||||||
x1 = ctx->Scissor.X;
|
x1 = ctx->Scissor.ScissorArray[0].X;
|
||||||
y1 = ctx->DrawBuffer->Height - (ctx->Scissor.Y + ctx->Scissor.Height);
|
y1 = ctx->DrawBuffer->Height - (ctx->Scissor.ScissorArray[0].Y
|
||||||
x2 = ctx->Scissor.X + ctx->Scissor.Width - 1;
|
+ ctx->Scissor.ScissorArray[0].Height);
|
||||||
y2 = y1 + ctx->Scissor.Height - 1;
|
x2 = ctx->Scissor.ScissorArray[0].X
|
||||||
|
+ ctx->Scissor.ScissorArray[0].Width - 1;
|
||||||
|
y2 = y1 + ctx->Scissor.ScissorArray[0].Height - 1;
|
||||||
DBG("%s %d..%d,%d..%d (inverted)\n", __FUNCTION__, x1, x2, y1, y2);
|
DBG("%s %d..%d,%d..%d (inverted)\n", __FUNCTION__, x1, x2, y1, y2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* FBO - not inverted
|
/* FBO - not inverted
|
||||||
*/
|
*/
|
||||||
x1 = ctx->Scissor.X;
|
x1 = ctx->Scissor.ScissorArray[0].X;
|
||||||
y1 = ctx->Scissor.Y;
|
y1 = ctx->Scissor.ScissorArray[0].Y;
|
||||||
x2 = ctx->Scissor.X + ctx->Scissor.Width - 1;
|
x2 = ctx->Scissor.ScissorArray[0].X
|
||||||
y2 = ctx->Scissor.Y + ctx->Scissor.Height - 1;
|
+ ctx->Scissor.ScissorArray[0].Width - 1;
|
||||||
|
y2 = ctx->Scissor.ScissorArray[0].Y
|
||||||
|
+ ctx->Scissor.ScissorArray[0].Height - 1;
|
||||||
DBG("%s %d..%d,%d..%d (not inverted)\n", __FUNCTION__, x1, x2, y1, y2);
|
DBG("%s %d..%d,%d..%d (not inverted)\n", __FUNCTION__, x1, x2, y1, y2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -658,7 +658,7 @@ intel_blit_framebuffer_with_blitter(struct gl_context *ctx,
|
|||||||
srcY0 >= 0 && srcY1 <= readFb->Height &&
|
srcY0 >= 0 && srcY1 <= readFb->Height &&
|
||||||
dstX0 >= 0 && dstX1 <= drawFb->Width &&
|
dstX0 >= 0 && dstX1 <= drawFb->Width &&
|
||||||
dstY0 >= 0 && dstY1 <= drawFb->Height &&
|
dstY0 >= 0 && dstY1 <= drawFb->Height &&
|
||||||
!ctx->Scissor.Enabled)) {
|
!ctx->Scissor.EnableFlags)) {
|
||||||
perf_debug("glBlitFramebuffer(): non-1:1 blit. "
|
perf_debug("glBlitFramebuffer(): non-1:1 blit. "
|
||||||
"Falling back to software rendering.\n");
|
"Falling back to software rendering.\n");
|
||||||
return mask;
|
return mask;
|
||||||
|
@@ -83,10 +83,10 @@ debug_mask(const char *name, GLbitfield mask)
|
|||||||
static bool
|
static bool
|
||||||
noop_scissor(struct gl_context *ctx, struct gl_framebuffer *fb)
|
noop_scissor(struct gl_context *ctx, struct gl_framebuffer *fb)
|
||||||
{
|
{
|
||||||
return ctx->Scissor.X <= 0 &&
|
return ctx->Scissor.ScissorArray[0].X <= 0 &&
|
||||||
ctx->Scissor.Y <= 0 &&
|
ctx->Scissor.ScissorArray[0].Y <= 0 &&
|
||||||
ctx->Scissor.Width >= fb->Width &&
|
ctx->Scissor.ScissorArray[0].Width >= fb->Width &&
|
||||||
ctx->Scissor.Height >= fb->Height;
|
ctx->Scissor.ScissorArray[0].Height >= fb->Height;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,7 +121,7 @@ brw_fast_clear_depth(struct gl_context *ctx)
|
|||||||
* a previous clear had happened at a different clear value and resolve it
|
* a previous clear had happened at a different clear value and resolve it
|
||||||
* first.
|
* first.
|
||||||
*/
|
*/
|
||||||
if (ctx->Scissor.Enabled && !noop_scissor(ctx, fb)) {
|
if (ctx->Scissor.EnableFlags && !noop_scissor(ctx, fb)) {
|
||||||
perf_debug("Failed to fast clear depth due to scissor being enabled. "
|
perf_debug("Failed to fast clear depth due to scissor being enabled. "
|
||||||
"Possible 5%% performance win if avoided.\n");
|
"Possible 5%% performance win if avoided.\n");
|
||||||
return false;
|
return false;
|
||||||
@@ -218,7 +218,7 @@ brw_clear(struct gl_context *ctx, GLbitfield mask)
|
|||||||
{
|
{
|
||||||
struct brw_context *brw = brw_context(ctx);
|
struct brw_context *brw = brw_context(ctx);
|
||||||
struct gl_framebuffer *fb = ctx->DrawBuffer;
|
struct gl_framebuffer *fb = ctx->DrawBuffer;
|
||||||
bool partial_clear = ctx->Scissor.Enabled && !noop_scissor(ctx, fb);
|
bool partial_clear = ctx->Scissor.EnableFlags && !noop_scissor(ctx, fb);
|
||||||
|
|
||||||
if (!_mesa_check_conditional_render(ctx))
|
if (!_mesa_check_conditional_render(ctx))
|
||||||
return;
|
return;
|
||||||
|
@@ -179,7 +179,7 @@ static void upload_sf_unit( struct brw_context *brw )
|
|||||||
sf->sf5.viewport_transform = 1;
|
sf->sf5.viewport_transform = 1;
|
||||||
|
|
||||||
/* _NEW_SCISSOR */
|
/* _NEW_SCISSOR */
|
||||||
if (ctx->Scissor.Enabled)
|
if (ctx->Scissor.EnableFlags)
|
||||||
sf->sf6.scissor = 1;
|
sf->sf6.scissor = 1;
|
||||||
|
|
||||||
/* _NEW_POLYGON */
|
/* _NEW_POLYGON */
|
||||||
|
@@ -298,7 +298,7 @@ upload_sf_state(struct brw_context *brw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* _NEW_SCISSOR */
|
/* _NEW_SCISSOR */
|
||||||
if (ctx->Scissor.Enabled)
|
if (ctx->Scissor.EnableFlags)
|
||||||
dw3 |= GEN6_SF_SCISSOR_ENABLE;
|
dw3 |= GEN6_SF_SCISSOR_ENABLE;
|
||||||
|
|
||||||
/* _NEW_POLYGON */
|
/* _NEW_POLYGON */
|
||||||
|
@@ -186,7 +186,7 @@ upload_sf_state(struct brw_context *brw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* _NEW_SCISSOR */
|
/* _NEW_SCISSOR */
|
||||||
if (ctx->Scissor.Enabled)
|
if (ctx->Scissor.EnableFlags)
|
||||||
dw2 |= GEN6_SF_SCISSOR_ENABLE;
|
dw2 |= GEN6_SF_SCISSOR_ENABLE;
|
||||||
|
|
||||||
/* _NEW_LINE */
|
/* _NEW_LINE */
|
||||||
|
@@ -715,7 +715,7 @@ intel_blit_framebuffer_with_blitter(struct gl_context *ctx,
|
|||||||
srcY0 >= 0 && srcY1 <= readFb->Height &&
|
srcY0 >= 0 && srcY1 <= readFb->Height &&
|
||||||
dstX0 >= 0 && dstX1 <= drawFb->Width &&
|
dstX0 >= 0 && dstX1 <= drawFb->Width &&
|
||||||
dstY0 >= 0 && dstY1 <= drawFb->Height &&
|
dstY0 >= 0 && dstY1 <= drawFb->Height &&
|
||||||
!ctx->Scissor.Enabled)) {
|
!(ctx->Scissor.EnableFlags))) {
|
||||||
perf_debug("glBlitFramebuffer(): non-1:1 blit. "
|
perf_debug("glBlitFramebuffer(): non-1:1 blit. "
|
||||||
"Falling back to software rendering.\n");
|
"Falling back to software rendering.\n");
|
||||||
return mask;
|
return mask;
|
||||||
|
@@ -105,8 +105,8 @@ void radeonSetCliprects(radeonContextPtr radeon)
|
|||||||
void radeonUpdateScissor( struct gl_context *ctx )
|
void radeonUpdateScissor( struct gl_context *ctx )
|
||||||
{
|
{
|
||||||
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
|
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
|
||||||
GLint x = ctx->Scissor.X, y = ctx->Scissor.Y;
|
GLint x = ctx->Scissor.ScissorArray[0].X, y = ctx->Scissor.ScissorArray[0].Y;
|
||||||
GLsizei w = ctx->Scissor.Width, h = ctx->Scissor.Height;
|
GLsizei w = ctx->Scissor.ScissorArray[0].Width, h = ctx->Scissor.ScissorArray[0].Height;
|
||||||
int x1, y1, x2, y2;
|
int x1, y1, x2, y2;
|
||||||
int min_x, min_y, max_x, max_y;
|
int min_x, min_y, max_x, max_y;
|
||||||
|
|
||||||
@@ -145,7 +145,7 @@ void radeonUpdateScissor( struct gl_context *ctx )
|
|||||||
void radeonScissor(struct gl_context *ctx)
|
void radeonScissor(struct gl_context *ctx)
|
||||||
{
|
{
|
||||||
radeonContextPtr radeon = RADEON_CONTEXT(ctx);
|
radeonContextPtr radeon = RADEON_CONTEXT(ctx);
|
||||||
if (ctx->Scissor.Enabled) {
|
if (ctx->Scissor.EnableFlags) {
|
||||||
/* We don't pipeline cliprect changes */
|
/* We don't pipeline cliprect changes */
|
||||||
radeon_firevertices(radeon);
|
radeon_firevertices(radeon);
|
||||||
radeonUpdateScissor(ctx);
|
radeonUpdateScissor(ctx);
|
||||||
|
@@ -112,7 +112,7 @@ struct gl_enable_attrib
|
|||||||
GLboolean PolygonSmooth;
|
GLboolean PolygonSmooth;
|
||||||
GLboolean PolygonStipple;
|
GLboolean PolygonStipple;
|
||||||
GLboolean RescaleNormals;
|
GLboolean RescaleNormals;
|
||||||
GLboolean Scissor;
|
GLbitfield Scissor;
|
||||||
GLboolean Stencil;
|
GLboolean Stencil;
|
||||||
GLboolean StencilTwoSide; /* GL_EXT_stencil_two_side */
|
GLboolean StencilTwoSide; /* GL_EXT_stencil_two_side */
|
||||||
GLboolean MultisampleEnabled; /* GL_ARB_multisample */
|
GLboolean MultisampleEnabled; /* GL_ARB_multisample */
|
||||||
@@ -354,7 +354,7 @@ _mesa_PushAttrib(GLbitfield mask)
|
|||||||
attr->PolygonSmooth = ctx->Polygon.SmoothFlag;
|
attr->PolygonSmooth = ctx->Polygon.SmoothFlag;
|
||||||
attr->PolygonStipple = ctx->Polygon.StippleFlag;
|
attr->PolygonStipple = ctx->Polygon.StippleFlag;
|
||||||
attr->RescaleNormals = ctx->Transform.RescaleNormals;
|
attr->RescaleNormals = ctx->Transform.RescaleNormals;
|
||||||
attr->Scissor = ctx->Scissor.Enabled;
|
attr->Scissor = ctx->Scissor.EnableFlags;
|
||||||
attr->Stencil = ctx->Stencil.Enabled;
|
attr->Stencil = ctx->Stencil.Enabled;
|
||||||
attr->StencilTwoSide = ctx->Stencil.TestTwoSide;
|
attr->StencilTwoSide = ctx->Stencil.TestTwoSide;
|
||||||
attr->MultisampleEnabled = ctx->Multisample.Enabled;
|
attr->MultisampleEnabled = ctx->Multisample.Enabled;
|
||||||
@@ -658,7 +658,13 @@ pop_enable_group(struct gl_context *ctx, const struct gl_enable_attrib *enable)
|
|||||||
GL_POLYGON_SMOOTH);
|
GL_POLYGON_SMOOTH);
|
||||||
TEST_AND_UPDATE(ctx->Polygon.StippleFlag, enable->PolygonStipple,
|
TEST_AND_UPDATE(ctx->Polygon.StippleFlag, enable->PolygonStipple,
|
||||||
GL_POLYGON_STIPPLE);
|
GL_POLYGON_STIPPLE);
|
||||||
TEST_AND_UPDATE(ctx->Scissor.Enabled, enable->Scissor, GL_SCISSOR_TEST);
|
if (ctx->Scissor.EnableFlags != enable->Scissor) {
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < ctx->Const.MaxViewports; i++) {
|
||||||
|
_mesa_set_enablei(ctx, GL_SCISSOR_TEST, i, (enable->Scissor >> i) & 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
TEST_AND_UPDATE(ctx->Stencil.Enabled, enable->Stencil, GL_STENCIL_TEST);
|
TEST_AND_UPDATE(ctx->Stencil.Enabled, enable->Stencil, GL_STENCIL_TEST);
|
||||||
if (ctx->Extensions.EXT_stencil_two_side) {
|
if (ctx->Extensions.EXT_stencil_two_side) {
|
||||||
TEST_AND_UPDATE(ctx->Stencil.TestTwoSide, enable->StencilTwoSide, GL_STENCIL_TEST_TWO_SIDE_EXT);
|
TEST_AND_UPDATE(ctx->Stencil.TestTwoSide, enable->StencilTwoSide, GL_STENCIL_TEST_TWO_SIDE_EXT);
|
||||||
@@ -1264,9 +1270,13 @@ _mesa_PopAttrib(void)
|
|||||||
{
|
{
|
||||||
const struct gl_scissor_attrib *scissor;
|
const struct gl_scissor_attrib *scissor;
|
||||||
scissor = (const struct gl_scissor_attrib *) attr->data;
|
scissor = (const struct gl_scissor_attrib *) attr->data;
|
||||||
_mesa_Scissor(scissor->X, scissor->Y,
|
_mesa_set_scissor(ctx,
|
||||||
scissor->Width, scissor->Height);
|
scissor->ScissorArray[0].X,
|
||||||
_mesa_set_enable(ctx, GL_SCISSOR_TEST, scissor->Enabled);
|
scissor->ScissorArray[0].Y,
|
||||||
|
scissor->ScissorArray[0].Width,
|
||||||
|
scissor->ScissorArray[0].Height);
|
||||||
|
_mesa_set_enable(ctx, GL_SCISSOR_TEST, scissor->EnableFlags & 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_STENCIL_BUFFER_BIT:
|
case GL_STENCIL_BUFFER_BIT:
|
||||||
|
@@ -659,10 +659,15 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
|
|||||||
ctx->Transform.RescaleNormals = state;
|
ctx->Transform.RescaleNormals = state;
|
||||||
break;
|
break;
|
||||||
case GL_SCISSOR_TEST:
|
case GL_SCISSOR_TEST:
|
||||||
if (ctx->Scissor.Enabled == state)
|
{
|
||||||
return;
|
/* Must expand glEnable to all scissors */
|
||||||
FLUSH_VERTICES(ctx, _NEW_SCISSOR);
|
GLbitfield newEnabled =
|
||||||
ctx->Scissor.Enabled = state;
|
state * ((1 << ctx->Const.MaxViewports) - 1);
|
||||||
|
if (newEnabled != ctx->Scissor.EnableFlags) {
|
||||||
|
FLUSH_VERTICES(ctx, _NEW_SCISSOR);
|
||||||
|
ctx->Scissor.EnableFlags = newEnabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case GL_STENCIL_TEST:
|
case GL_STENCIL_TEST:
|
||||||
if (ctx->Stencil.Enabled == state)
|
if (ctx->Stencil.Enabled == state)
|
||||||
@@ -1076,6 +1081,20 @@ _mesa_set_enablei(struct gl_context *ctx, GLenum cap,
|
|||||||
ctx->Color.BlendEnabled &= ~(1 << index);
|
ctx->Color.BlendEnabled &= ~(1 << index);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case GL_SCISSOR_TEST:
|
||||||
|
if (index >= ctx->Const.MaxViewports) {
|
||||||
|
_mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)",
|
||||||
|
state ? "glEnablei" : "glDisablei", index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (((ctx->Scissor.EnableFlags >> index) & 1) != state) {
|
||||||
|
FLUSH_VERTICES(ctx, _NEW_SCISSOR);
|
||||||
|
if (state)
|
||||||
|
ctx->Scissor.EnableFlags |= (1 << index);
|
||||||
|
else
|
||||||
|
ctx->Scissor.EnableFlags &= ~(1 << index);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
goto invalid_enum_error;
|
goto invalid_enum_error;
|
||||||
}
|
}
|
||||||
@@ -1349,7 +1368,7 @@ _mesa_IsEnabled( GLenum cap )
|
|||||||
goto invalid_enum_error;
|
goto invalid_enum_error;
|
||||||
return ctx->Transform.RescaleNormals;
|
return ctx->Transform.RescaleNormals;
|
||||||
case GL_SCISSOR_TEST:
|
case GL_SCISSOR_TEST:
|
||||||
return ctx->Scissor.Enabled;
|
return ctx->Scissor.EnableFlags & 1; /* return state for index 0 */
|
||||||
case GL_STENCIL_TEST:
|
case GL_STENCIL_TEST:
|
||||||
return ctx->Stencil.Enabled;
|
return ctx->Stencil.Enabled;
|
||||||
case GL_TEXTURE_1D:
|
case GL_TEXTURE_1D:
|
||||||
|
@@ -380,18 +380,19 @@ _mesa_update_draw_buffer_bounds(struct gl_context *ctx)
|
|||||||
buffer->_Xmax = buffer->Width;
|
buffer->_Xmax = buffer->Width;
|
||||||
buffer->_Ymax = buffer->Height;
|
buffer->_Ymax = buffer->Height;
|
||||||
|
|
||||||
if (ctx->Scissor.Enabled) {
|
/* Default to the first scissor as that's always valid */
|
||||||
if (ctx->Scissor.X > buffer->_Xmin) {
|
if (ctx->Scissor.EnableFlags & 1) {
|
||||||
buffer->_Xmin = ctx->Scissor.X;
|
if (ctx->Scissor.ScissorArray[0].X > buffer->_Xmin) {
|
||||||
|
buffer->_Xmin = ctx->Scissor.ScissorArray[0].X;
|
||||||
}
|
}
|
||||||
if (ctx->Scissor.Y > buffer->_Ymin) {
|
if (ctx->Scissor.ScissorArray[0].Y > buffer->_Ymin) {
|
||||||
buffer->_Ymin = ctx->Scissor.Y;
|
buffer->_Ymin = ctx->Scissor.ScissorArray[0].Y;
|
||||||
}
|
}
|
||||||
if (ctx->Scissor.X + ctx->Scissor.Width < buffer->_Xmax) {
|
if (ctx->Scissor.ScissorArray[0].X + ctx->Scissor.ScissorArray[0].Width < buffer->_Xmax) {
|
||||||
buffer->_Xmax = ctx->Scissor.X + ctx->Scissor.Width;
|
buffer->_Xmax = ctx->Scissor.ScissorArray[0].X + ctx->Scissor.ScissorArray[0].Width;
|
||||||
}
|
}
|
||||||
if (ctx->Scissor.Y + ctx->Scissor.Height < buffer->_Ymax) {
|
if (ctx->Scissor.ScissorArray[0].Y + ctx->Scissor.ScissorArray[0].Height < buffer->_Ymax) {
|
||||||
buffer->_Ymax = ctx->Scissor.Y + ctx->Scissor.Height;
|
buffer->_Ymax = ctx->Scissor.ScissorArray[0].Y + ctx->Scissor.ScissorArray[0].Height;
|
||||||
}
|
}
|
||||||
/* finally, check for empty region */
|
/* finally, check for empty region */
|
||||||
if (buffer->_Xmin > buffer->_Xmax) {
|
if (buffer->_Xmin > buffer->_Xmax) {
|
||||||
|
@@ -665,10 +665,14 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GL_SCISSOR_BOX:
|
case GL_SCISSOR_BOX:
|
||||||
v->value_int_4[0] = ctx->Scissor.X;
|
v->value_int_4[0] = ctx->Scissor.ScissorArray[0].X;
|
||||||
v->value_int_4[1] = ctx->Scissor.Y;
|
v->value_int_4[1] = ctx->Scissor.ScissorArray[0].Y;
|
||||||
v->value_int_4[2] = ctx->Scissor.Width;
|
v->value_int_4[2] = ctx->Scissor.ScissorArray[0].Width;
|
||||||
v->value_int_4[3] = ctx->Scissor.Height;
|
v->value_int_4[3] = ctx->Scissor.ScissorArray[0].Height;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GL_SCISSOR_TEST:
|
||||||
|
v->value_bool = ctx->Scissor.EnableFlags & 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GL_LIST_INDEX:
|
case GL_LIST_INDEX:
|
||||||
|
@@ -30,7 +30,7 @@ descriptor=[
|
|||||||
[ "POLYGON_OFFSET_FILL", "CONTEXT_BOOL(Polygon.OffsetFill), NO_EXTRA" ],
|
[ "POLYGON_OFFSET_FILL", "CONTEXT_BOOL(Polygon.OffsetFill), NO_EXTRA" ],
|
||||||
[ "RED_BITS", "BUFFER_INT(Visual.redBits), extra_new_buffers" ],
|
[ "RED_BITS", "BUFFER_INT(Visual.redBits), extra_new_buffers" ],
|
||||||
[ "SCISSOR_BOX", "LOC_CUSTOM, TYPE_INT_4, 0, NO_EXTRA" ],
|
[ "SCISSOR_BOX", "LOC_CUSTOM, TYPE_INT_4, 0, NO_EXTRA" ],
|
||||||
[ "SCISSOR_TEST", "CONTEXT_BOOL(Scissor.Enabled), NO_EXTRA" ],
|
[ "SCISSOR_TEST", "LOC_CUSTOM, TYPE_BOOLEAN, NO_OFFSET, NO_EXTRA" ],
|
||||||
[ "STENCIL_BITS", "BUFFER_INT(Visual.stencilBits), extra_new_buffers" ],
|
[ "STENCIL_BITS", "BUFFER_INT(Visual.stencilBits), extra_new_buffers" ],
|
||||||
[ "STENCIL_CLEAR_VALUE", "CONTEXT_INT(Stencil.Clear), NO_EXTRA" ],
|
[ "STENCIL_CLEAR_VALUE", "CONTEXT_INT(Stencil.Clear), NO_EXTRA" ],
|
||||||
[ "STENCIL_FAIL", "LOC_CUSTOM, TYPE_ENUM, NO_OFFSET, NO_EXTRA" ],
|
[ "STENCIL_FAIL", "LOC_CUSTOM, TYPE_ENUM, NO_OFFSET, NO_EXTRA" ],
|
||||||
|
@@ -1009,12 +1009,16 @@ struct gl_polygon_attrib
|
|||||||
/**
|
/**
|
||||||
* Scissor attributes (GL_SCISSOR_BIT).
|
* Scissor attributes (GL_SCISSOR_BIT).
|
||||||
*/
|
*/
|
||||||
struct gl_scissor_attrib
|
struct gl_scissor_rect
|
||||||
{
|
{
|
||||||
GLboolean Enabled; /**< Scissor test enabled? */
|
|
||||||
GLint X, Y; /**< Lower left corner of box */
|
GLint X, Y; /**< Lower left corner of box */
|
||||||
GLsizei Width, Height; /**< Size of box */
|
GLsizei Width, Height; /**< Size of box */
|
||||||
};
|
};
|
||||||
|
struct gl_scissor_attrib
|
||||||
|
{
|
||||||
|
GLbitfield EnableFlags; /**< Scissor test enabled? */
|
||||||
|
struct gl_scissor_rect ScissorArray[MAX_VIEWPORTS];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -66,17 +66,17 @@ void
|
|||||||
_mesa_set_scissor(struct gl_context *ctx,
|
_mesa_set_scissor(struct gl_context *ctx,
|
||||||
GLint x, GLint y, GLsizei width, GLsizei height)
|
GLint x, GLint y, GLsizei width, GLsizei height)
|
||||||
{
|
{
|
||||||
if (x == ctx->Scissor.X &&
|
if (x == ctx->Scissor.ScissorArray[0].X &&
|
||||||
y == ctx->Scissor.Y &&
|
y == ctx->Scissor.ScissorArray[0].Y &&
|
||||||
width == ctx->Scissor.Width &&
|
width == ctx->Scissor.ScissorArray[0].Width &&
|
||||||
height == ctx->Scissor.Height)
|
height == ctx->Scissor.ScissorArray[0].Height)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
FLUSH_VERTICES(ctx, _NEW_SCISSOR);
|
FLUSH_VERTICES(ctx, _NEW_SCISSOR);
|
||||||
ctx->Scissor.X = x;
|
ctx->Scissor.ScissorArray[0].X = x;
|
||||||
ctx->Scissor.Y = y;
|
ctx->Scissor.ScissorArray[0].Y = y;
|
||||||
ctx->Scissor.Width = width;
|
ctx->Scissor.ScissorArray[0].Width = width;
|
||||||
ctx->Scissor.Height = height;
|
ctx->Scissor.ScissorArray[0].Height = height;
|
||||||
|
|
||||||
if (ctx->Driver.Scissor)
|
if (ctx->Driver.Scissor)
|
||||||
ctx->Driver.Scissor(ctx);
|
ctx->Driver.Scissor(ctx);
|
||||||
@@ -91,9 +91,9 @@ void
|
|||||||
_mesa_init_scissor(struct gl_context *ctx)
|
_mesa_init_scissor(struct gl_context *ctx)
|
||||||
{
|
{
|
||||||
/* Scissor group */
|
/* Scissor group */
|
||||||
ctx->Scissor.Enabled = GL_FALSE;
|
ctx->Scissor.EnableFlags = GL_FALSE;
|
||||||
ctx->Scissor.X = 0;
|
ctx->Scissor.ScissorArray[0].X = 0;
|
||||||
ctx->Scissor.Y = 0;
|
ctx->Scissor.ScissorArray[0].Y = 0;
|
||||||
ctx->Scissor.Width = 0;
|
ctx->Scissor.ScissorArray[0].Width = 0;
|
||||||
ctx->Scissor.Height = 0;
|
ctx->Scissor.ScissorArray[0].Height = 0;
|
||||||
}
|
}
|
||||||
|
@@ -223,7 +223,7 @@ static void update_raster_state( struct st_context *st )
|
|||||||
raster->multisample = ctx->Multisample._Enabled;
|
raster->multisample = ctx->Multisample._Enabled;
|
||||||
|
|
||||||
/* _NEW_SCISSOR */
|
/* _NEW_SCISSOR */
|
||||||
raster->scissor = ctx->Scissor.Enabled;
|
raster->scissor = ctx->Scissor.EnableFlags;
|
||||||
|
|
||||||
/* _NEW_FRAG_CLAMP */
|
/* _NEW_FRAG_CLAMP */
|
||||||
raster->clamp_fragment_color = !st->clamp_frag_color_in_shader &&
|
raster->clamp_fragment_color = !st->clamp_frag_color_in_shader &&
|
||||||
|
@@ -53,15 +53,15 @@ update_scissor( struct st_context *st )
|
|||||||
scissor.maxx = fb->Width;
|
scissor.maxx = fb->Width;
|
||||||
scissor.maxy = fb->Height;
|
scissor.maxy = fb->Height;
|
||||||
|
|
||||||
if (ctx->Scissor.Enabled) {
|
if (ctx->Scissor.EnableFlags & 1) {
|
||||||
/* need to be careful here with xmax or ymax < 0 */
|
/* need to be careful here with xmax or ymax < 0 */
|
||||||
GLint xmax = MAX2(0, ctx->Scissor.X + ctx->Scissor.Width);
|
GLint xmax = MAX2(0, ctx->Scissor.ScissorArray[0].X + ctx->Scissor.ScissorArray[0].Width);
|
||||||
GLint ymax = MAX2(0, ctx->Scissor.Y + ctx->Scissor.Height);
|
GLint ymax = MAX2(0, ctx->Scissor.ScissorArray[0].Y + ctx->Scissor.ScissorArray[0].Height);
|
||||||
|
|
||||||
if (ctx->Scissor.X > (GLint)scissor.minx)
|
if (ctx->Scissor.ScissorArray[0].X > (GLint)scissor.minx)
|
||||||
scissor.minx = ctx->Scissor.X;
|
scissor.minx = ctx->Scissor.ScissorArray[0].X;
|
||||||
if (ctx->Scissor.Y > (GLint)scissor.miny)
|
if (ctx->Scissor.ScissorArray[0].Y > (GLint)scissor.miny)
|
||||||
scissor.miny = ctx->Scissor.Y;
|
scissor.miny = ctx->Scissor.ScissorArray[0].Y;
|
||||||
|
|
||||||
if (xmax < (GLint) scissor.maxx)
|
if (xmax < (GLint) scissor.maxx)
|
||||||
scissor.maxx = xmax;
|
scissor.maxx = xmax;
|
||||||
|
@@ -457,7 +457,7 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
|||||||
cso_save_aux_vertex_buffer_slot(cso);
|
cso_save_aux_vertex_buffer_slot(cso);
|
||||||
|
|
||||||
/* rasterizer state: just scissor */
|
/* rasterizer state: just scissor */
|
||||||
st->bitmap.rasterizer.scissor = ctx->Scissor.Enabled;
|
st->bitmap.rasterizer.scissor = ctx->Scissor.EnableFlags & 1;
|
||||||
cso_set_rasterizer(cso, &st->bitmap.rasterizer);
|
cso_set_rasterizer(cso, &st->bitmap.rasterizer);
|
||||||
|
|
||||||
/* fragment shader state: TEX lookup program */
|
/* fragment shader state: TEX lookup program */
|
||||||
|
@@ -364,11 +364,11 @@ clear_with_quad(struct gl_context *ctx, unsigned clear_buffers)
|
|||||||
static INLINE GLboolean
|
static INLINE GLboolean
|
||||||
is_scissor_enabled(struct gl_context *ctx, struct gl_renderbuffer *rb)
|
is_scissor_enabled(struct gl_context *ctx, struct gl_renderbuffer *rb)
|
||||||
{
|
{
|
||||||
return ctx->Scissor.Enabled &&
|
return (ctx->Scissor.EnableFlags & 1) &&
|
||||||
(ctx->Scissor.X > 0 ||
|
(ctx->Scissor.ScissorArray[0].X > 0 ||
|
||||||
ctx->Scissor.Y > 0 ||
|
ctx->Scissor.ScissorArray[0].Y > 0 ||
|
||||||
(unsigned) ctx->Scissor.Width < rb->Width ||
|
(unsigned) ctx->Scissor.ScissorArray[0].Width < rb->Width ||
|
||||||
(unsigned) ctx->Scissor.Height < rb->Height);
|
(unsigned) ctx->Scissor.ScissorArray[0].Height < rb->Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -713,7 +713,7 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
|||||||
rasterizer.half_pixel_center = 1;
|
rasterizer.half_pixel_center = 1;
|
||||||
rasterizer.bottom_edge_rule = 1;
|
rasterizer.bottom_edge_rule = 1;
|
||||||
rasterizer.depth_clip = !ctx->Transform.DepthClamp;
|
rasterizer.depth_clip = !ctx->Transform.DepthClamp;
|
||||||
rasterizer.scissor = ctx->Scissor.Enabled;
|
rasterizer.scissor = ctx->Scissor.EnableFlags;
|
||||||
cso_set_rasterizer(cso, &rasterizer);
|
cso_set_rasterizer(cso, &rasterizer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -61,7 +61,7 @@ _swrast_update_rasterflags( struct gl_context *ctx )
|
|||||||
if (ctx->Color.BlendEnabled) rasterMask |= BLEND_BIT;
|
if (ctx->Color.BlendEnabled) rasterMask |= BLEND_BIT;
|
||||||
if (ctx->Depth.Test) rasterMask |= DEPTH_BIT;
|
if (ctx->Depth.Test) rasterMask |= DEPTH_BIT;
|
||||||
if (swrast->_FogEnabled) rasterMask |= FOG_BIT;
|
if (swrast->_FogEnabled) rasterMask |= FOG_BIT;
|
||||||
if (ctx->Scissor.Enabled) rasterMask |= CLIP_BIT;
|
if (ctx->Scissor.EnableFlags) rasterMask |= CLIP_BIT;
|
||||||
if (ctx->Stencil._Enabled) rasterMask |= STENCIL_BIT;
|
if (ctx->Stencil._Enabled) rasterMask |= STENCIL_BIT;
|
||||||
for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
|
for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
|
||||||
if (!ctx->Color.ColorMask[i][0] ||
|
if (!ctx->Color.ColorMask[i][0] ||
|
||||||
|
Reference in New Issue
Block a user