diff options
author | Marek Olšák <[email protected]> | 2016-07-17 19:47:12 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2016-07-30 15:02:14 +0200 |
commit | 0a46e6f410f2838886828e18f0b6604b2702d809 (patch) | |
tree | c0fb847917cd5af4875c40e2b802581bcb32e649 /src/mesa/state_tracker | |
parent | c8fe3b9dca73e3b91979d92ba4136b302001b3bb (diff) |
st/mesa: skip updates of states that have no effect
v2: - also don't check edge flags for GLES
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_atom.c | 15 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_atom.h | 22 |
2 files changed, 28 insertions, 9 deletions
diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c index 32b8602a9d4..ef50ef9df9a 100644 --- a/src/mesa/state_tracker/st_atom.c +++ b/src/mesa/state_tracker/st_atom.c @@ -107,6 +107,7 @@ static void check_attrib_edgeflag(struct st_context *st) void st_validate_state( struct st_context *st, enum st_pipeline pipeline ) { + struct gl_context *ctx = st->ctx; uint64_t dirty, pipeline_mask; uint32_t dirty_lo, dirty_hi; @@ -117,11 +118,23 @@ void st_validate_state( struct st_context *st, enum st_pipeline pipeline ) /* Get pipeline state. */ switch (pipeline) { case ST_PIPELINE_RENDER: - check_attrib_edgeflag(st); + if (st->ctx->API == API_OPENGL_COMPAT) + check_attrib_edgeflag(st); + check_program_state(st); st_manager_validate_framebuffers(st); pipeline_mask = ST_PIPELINE_RENDER_STATE_MASK; + + /* Don't update states that have no effect. */ + if (!ctx->TessCtrlProgram._Current) + pipeline_mask &= ~ST_NEW_TCS_RESOURCES; + if (!ctx->TessEvalProgram._Current) + pipeline_mask &= ~ST_NEW_TES_RESOURCES; + if (!ctx->GeometryProgram._Current) + pipeline_mask &= ~ST_NEW_GS_RESOURCES; + if (!ctx->Transform.ClipPlanesEnabled) + pipeline_mask &= ~ST_NEW_CLIP_STATE; break; case ST_PIPELINE_COMPUTE: pipeline_mask = ST_PIPELINE_COMPUTE_STATE_MASK; diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h index 871afc6ead5..961c395b89d 100644 --- a/src/mesa/state_tracker/st_atom.h +++ b/src/mesa/state_tracker/st_atom.h @@ -99,30 +99,36 @@ enum { ST_NEW_CLIP_STATE | \ ST_NEW_RASTERIZER) -#define ST_NEW_TESSCTRL_PROGRAM (ST_NEW_TCS_STATE | \ - ST_NEW_TCS_SAMPLER_VIEWS | \ +#define ST_NEW_TCS_RESOURCES (ST_NEW_TCS_SAMPLER_VIEWS | \ ST_NEW_TCS_IMAGES | \ ST_NEW_TCS_CONSTANTS | \ ST_NEW_TCS_UBOS | \ ST_NEW_TCS_ATOMICS | \ ST_NEW_TCS_SSBOS) -#define ST_NEW_TESSEVAL_PROGRAM (ST_NEW_TES_STATE | \ - ST_NEW_TES_SAMPLER_VIEWS | \ +#define ST_NEW_TESSCTRL_PROGRAM (ST_NEW_TCS_STATE | \ + ST_NEW_TCS_RESOURCES) + +#define ST_NEW_TES_RESOURCES (ST_NEW_TES_SAMPLER_VIEWS | \ ST_NEW_TES_IMAGES | \ ST_NEW_TES_CONSTANTS | \ ST_NEW_TES_UBOS | \ ST_NEW_TES_ATOMICS | \ - ST_NEW_TES_SSBOS | \ + ST_NEW_TES_SSBOS) + +#define ST_NEW_TESSEVAL_PROGRAM (ST_NEW_TES_STATE | \ + ST_NEW_TES_RESOURCES | \ ST_NEW_RASTERIZER) -#define ST_NEW_GEOMETRY_PROGRAM (ST_NEW_GS_STATE | \ - ST_NEW_GS_SAMPLER_VIEWS | \ +#define ST_NEW_GS_RESOURCES (ST_NEW_GS_SAMPLER_VIEWS | \ ST_NEW_GS_IMAGES | \ ST_NEW_GS_CONSTANTS | \ ST_NEW_GS_UBOS | \ ST_NEW_GS_ATOMICS | \ - ST_NEW_GS_SSBOS | \ + ST_NEW_GS_SSBOS) + +#define ST_NEW_GEOMETRY_PROGRAM (ST_NEW_GS_STATE | \ + ST_NEW_GS_RESOURCES | \ ST_NEW_RASTERIZER) #define ST_NEW_FRAGMENT_PROGRAM (ST_NEW_FS_STATE | \ |