diff options
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 | \ |