diff options
author | Marek Olšák <[email protected]> | 2017-06-10 12:09:43 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-06-22 01:51:02 +0200 |
commit | 00173d91b70ae4dcea7c6324ee4858c498cae14b (patch) | |
tree | 1f3f7bcf4f7b17b1be58d50123d7b7efec8b6356 | |
parent | 55f1106637a122f6b6c91d45acb721398328cc17 (diff) |
mesa: don't flag _NEW_TRANSFORM for st/mesa if possible
Reviewed-by: Nicolai Hähnle <[email protected]>
Reviewed-by: Brian Paul <[email protected]>
Reviewed-by: Timothy Arceri <[email protected]>
-rw-r--r-- | src/mesa/main/clip.c | 2 | ||||
-rw-r--r-- | src/mesa/main/enable.c | 15 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 11 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_context.c | 9 |
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; } |