diff options
author | Marek Olšák <[email protected]> | 2017-06-10 02:39:06 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-06-22 01:51:02 +0200 |
commit | 29db5c1dcc5940fd18e72d1a7295cbb9edb424d8 (patch) | |
tree | 86d13624db607744af3ae8d43b411cfcbcd93485 | |
parent | c8363eb0276c863100a457b18fee5ef900cf6f74 (diff) |
mesa: don't flag _NEW_VIEWPORT 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/mtypes.h | 6 | ||||
-rw-r--r-- | src/mesa/main/viewport.c | 9 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_context.c | 6 |
3 files changed, 16 insertions, 5 deletions
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index c4e67353e9f..59292f0c8a4 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -4507,6 +4507,12 @@ struct gl_driver_flags /** gl_context::Stencil */ uint64_t NewStencil; + + /** gl_context::Transform::Clip* */ + uint64_t NewClipControl; + + /** gl_context::ViewportArray */ + uint64_t NewViewport; }; struct gl_uniform_buffer_binding diff --git a/src/mesa/main/viewport.c b/src/mesa/main/viewport.c index 6d3e57654cc..51ae6692f7b 100644 --- a/src/mesa/main/viewport.c +++ b/src/mesa/main/viewport.c @@ -40,7 +40,8 @@ set_viewport_no_notify(struct gl_context *ctx, unsigned idx, GLfloat x, GLfloat y, GLfloat width, GLfloat height) { - FLUSH_VERTICES(ctx, _NEW_VIEWPORT); + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewViewport ? 0 : _NEW_VIEWPORT); + ctx->NewDriverState |= ctx->DriverFlags.NewViewport; /* clamp width and height to the implementation dependent range */ width = MIN2(width, (GLfloat) ctx->Const.MaxViewportWidth); @@ -241,7 +242,9 @@ set_depth_range_no_notify(struct gl_context *ctx, unsigned idx, ctx->ViewportArray[idx].Far == farval) return; + /* The depth range is needed by program state constants. */ FLUSH_VERTICES(ctx, _NEW_VIEWPORT); + ctx->NewDriverState |= ctx->DriverFlags.NewViewport; ctx->ViewportArray[idx].Near = CLAMP(nearval, 0.0, 1.0); ctx->ViewportArray[idx].Far = CLAMP(farval, 0.0, 1.0); @@ -449,7 +452,9 @@ _mesa_ClipControl(GLenum origin, GLenum depth) return; /* Affects transform state and the viewport transform */ - FLUSH_VERTICES(ctx, _NEW_TRANSFORM | _NEW_VIEWPORT); + FLUSH_VERTICES(ctx, ctx->DriverFlags.NewClipControl ? 0 : + _NEW_TRANSFORM | _NEW_VIEWPORT); + ctx->NewDriverState |= ctx->DriverFlags.NewClipControl; if (ctx->Transform.ClipOrigin != origin) { ctx->Transform.ClipOrigin = origin; diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 23e3768373f..c5f46aedb45 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -202,9 +202,6 @@ st_invalidate_state(struct gl_context * ctx) if (new_state & _NEW_POLYGONSTIPPLE) st->dirty |= ST_NEW_POLY_STIPPLE; - if (new_state & _NEW_VIEWPORT) - st->dirty |= ST_NEW_VIEWPORT; - if (new_state & _NEW_FRAG_CLAMP) { if (st->clamp_frag_color_in_shader) st->dirty |= ST_NEW_FS_STATE; @@ -524,6 +521,9 @@ static void st_init_driver_flags(struct st_context *st) } else { f->NewSampleShading |= ST_NEW_RASTERIZER; } + + f->NewClipControl = ST_NEW_VIEWPORT | ST_NEW_RASTERIZER; + f->NewViewport = ST_NEW_VIEWPORT; } struct st_context *st_create_context(gl_api api, struct pipe_context *pipe, |