summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/main/clip.c2
-rw-r--r--src/mesa/main/enable.c15
-rw-r--r--src/mesa/main/mtypes.h11
-rw-r--r--src/mesa/state_tracker/st_context.c9
4 files changed, 30 insertions, 7 deletions
diff --git a/src/mesa/main/clip.c b/src/mesa/main/clip.c
index f994728bc95..0950283ff3c 100644
--- a/src/mesa/main/clip.c
+++ b/src/mesa/main/clip.c
@@ -83,7 +83,9 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq )
if (TEST_EQ_4V(ctx->Transform.EyeUserPlane[p], equation))
return;
+ /* EyeUserPlane is used by program state constants. */
FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
+ ctx->NewDriverState |= ctx->DriverFlags.NewClipPlane;
COPY_4FV(ctx->Transform.EyeUserPlane[p], equation);
if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {
diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
index f5bd48cd90f..2f348d8940f 100644
--- a/src/mesa/main/enable.c
+++ b/src/mesa/main/enable.c
@@ -346,7 +346,16 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
== ((GLuint) state << p))
return;
- FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
+ /* The compatibility profile needs _NEW_TRANSFORM to transform
+ * clip planes according to the projection matrix.
+ */
+ if (ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGLES ||
+ !ctx->DriverFlags.NewClipPlaneEnable) {
+ FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
+ } else {
+ FLUSH_VERTICES(ctx, 0);
+ }
+ ctx->NewDriverState |= ctx->DriverFlags.NewClipPlaneEnable;
if (state) {
ctx->Transform.ClipPlanesEnabled |= (1 << p);
@@ -973,7 +982,9 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
CHECK_EXTENSION(ARB_depth_clamp, cap);
if (ctx->Transform.DepthClamp == state)
return;
- FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
+ FLUSH_VERTICES(ctx, ctx->DriverFlags.NewDepthClamp ? 0 :
+ _NEW_TRANSFORM);
+ ctx->NewDriverState |= ctx->DriverFlags.NewDepthClamp;
ctx->Transform.DepthClamp = state;
break;
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 59292f0c8a4..2d27e767a2a 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -4508,9 +4508,18 @@ struct gl_driver_flags
/** gl_context::Stencil */
uint64_t NewStencil;
- /** gl_context::Transform::Clip* */
+ /** gl_context::Transform::ClipOrigin/ClipDepthMode */
uint64_t NewClipControl;
+ /** gl_context::Transform::EyeUserPlane */
+ uint64_t NewClipPlane;
+
+ /** gl_context::Transform::ClipPlanesEnabled */
+ uint64_t NewClipPlaneEnable;
+
+ /** gl_context::Transform::DepthClamp */
+ uint64_t NewDepthClamp;
+
/** gl_context::ViewportArray */
uint64_t NewViewport;
};
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index c5f46aedb45..23aad0a1f41 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -213,12 +213,10 @@ st_invalidate_state(struct gl_context * ctx)
if (new_state & (_NEW_LIGHT |
_NEW_LINE |
_NEW_POINT |
- _NEW_POLYGON |
- _NEW_TRANSFORM))
+ _NEW_POLYGON))
st->dirty |= ST_NEW_RASTERIZER;
- if (new_state & (_NEW_PROJECTION |
- _NEW_TRANSFORM) &&
+ if (new_state & _NEW_PROJECTION &&
st_user_clip_planes_enabled(ctx))
st->dirty |= ST_NEW_CLIP_STATE;
@@ -523,6 +521,9 @@ static void st_init_driver_flags(struct st_context *st)
}
f->NewClipControl = ST_NEW_VIEWPORT | ST_NEW_RASTERIZER;
+ f->NewClipPlane = ST_NEW_CLIP_STATE;
+ f->NewClipPlaneEnable = ST_NEW_RASTERIZER;
+ f->NewDepthClamp = ST_NEW_RASTERIZER;
f->NewViewport = ST_NEW_VIEWPORT;
}