[Mesa-dev] [PATCH 6/8] st/mesa: _NEW_TEXTURE & CONSTANTS shouldn't flag states that aren't used
Nicolai Hähnle
nhaehnle at gmail.com
Tue Aug 9 10:53:27 UTC 2016
On 07.08.2016 03:12, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> src/mesa/state_tracker/st_context.c | 64 ++++++++++++++++++++++++++++++++-----
> src/mesa/state_tracker/st_context.h | 6 ++++
> 2 files changed, 62 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index 1ff0355..b9fc9e7 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -116,20 +116,65 @@ st_query_memory_info(struct gl_context *ctx, struct gl_memory_info *out)
>
> out->total_device_memory = info.total_device_memory;
> out->avail_device_memory = info.avail_device_memory;
> out->total_staging_memory = info.total_staging_memory;
> out->avail_staging_memory = info.avail_staging_memory;
> out->device_memory_evicted = info.device_memory_evicted;
> out->nr_device_memory_evictions = info.nr_device_memory_evictions;
> }
>
>
> +uint64_t
> +st_get_active_states(struct gl_context *ctx)
> +{
> + struct st_vertex_program *vp =
> + st_vertex_program(ctx->VertexProgram._Current);
> + struct st_tessctrl_program *tcp =
> + st_tessctrl_program(ctx->TessCtrlProgram._Current);
> + struct st_tesseval_program *tep =
> + st_tesseval_program(ctx->TessEvalProgram._Current);
> + struct st_geometry_program *gp =
> + st_geometry_program(ctx->GeometryProgram._Current);
> + struct st_fragment_program *fp =
> + st_fragment_program(ctx->FragmentProgram._Current);
> + struct st_compute_program *cp =
> + st_compute_program(ctx->ComputeProgram._Current);
> +
> + uint64_t active_shader_states = 0;
> + uint64_t all_shader_resources;
> +
> + if (vp)
> + active_shader_states |= vp->affected_states;
> + if (tcp)
> + active_shader_states |= tcp->affected_states;
> + if (tep)
> + active_shader_states |= tep->affected_states;
> + if (gp)
> + active_shader_states |= gp->affected_states;
> + if (fp)
> + active_shader_states |= fp->affected_states;
> + if (cp)
> + active_shader_states |= cp->affected_states;
> +
> + all_shader_resources = ST_NEW_SAMPLER_VIEWS |
> + ST_NEW_SAMPLERS |
> + ST_NEW_CONSTANTS |
> + ST_NEW_UNIFORM_BUFFER |
> + ST_NEW_ATOMIC_BUFFER |
> + ST_NEW_STORAGE_BUFFER |
> + ST_NEW_IMAGE_UNITS;
This should probably be a #define in st_atom.h.
Nicolai
> +
> + /* Mark non-shader-resource shader states as "always active". */
> + return active_shader_states | ~all_shader_resources;
> +}
> +
> +
> /**
> * Called via ctx->Driver.UpdateState()
> */
> void st_invalidate_state(struct gl_context * ctx, GLbitfield new_state)
> {
> struct st_context *st = st_context(ctx);
>
> if (new_state & _NEW_BUFFERS) {
> st->dirty |= ST_NEW_DSA |
> ST_NEW_FB_STATE |
> @@ -197,41 +242,44 @@ void st_invalidate_state(struct gl_context * ctx, GLbitfield new_state)
> st_user_clip_planes_enabled(ctx))
> st->dirty |= ST_NEW_CLIP_STATE;
>
> if (new_state & _NEW_COLOR)
> st->dirty |= ST_NEW_BLEND |
> ST_NEW_DSA;
>
> if (new_state & _NEW_PIXEL)
> st->dirty |= ST_NEW_PIXEL_TRANSFER;
>
> - if (new_state & _NEW_TEXTURE)
> - st->dirty |= ST_NEW_SAMPLER_VIEWS |
> - ST_NEW_SAMPLERS |
> - ST_NEW_IMAGE_UNITS;
> -
> if (new_state & _NEW_CURRENT_ATTRIB)
> st->dirty |= ST_NEW_VERTEX_ARRAYS;
>
> - if (new_state & _NEW_PROGRAM_CONSTANTS)
> - st->dirty |= ST_NEW_CONSTANTS;
> -
> /* Update the vertex shader if ctx->Light._ClampVertexColor was changed. */
> if (st->clamp_vert_color_in_shader && (new_state & _NEW_LIGHT))
> st->dirty |= ST_NEW_VS_STATE;
>
> /* Which shaders are dirty will be determined manually. */
> if (new_state & _NEW_PROGRAM) {
> st->gfx_shaders_may_be_dirty = true;
> st->compute_shader_may_be_dirty = true;
> + /* This will mask out unused shader resources. */
> + st->active_states = st_get_active_states(ctx);
> }
>
> + if (new_state & _NEW_TEXTURE)
> + st->dirty |= st->active_states &
> + (ST_NEW_SAMPLER_VIEWS |
> + ST_NEW_SAMPLERS |
> + ST_NEW_IMAGE_UNITS);
> +
> + if (new_state & _NEW_PROGRAM_CONSTANTS)
> + st->dirty |= st->active_states & ST_NEW_CONSTANTS;
> +
> /* This is the only core Mesa module we depend upon.
> * No longer use swrast, swsetup, tnl.
> */
> _vbo_InvalidateState(ctx, new_state);
> }
>
>
> static void
> st_destroy_context_priv(struct st_context *st)
> {
> diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
> index 556b9c9..f82cf3a 100644
> --- a/src/mesa/state_tracker/st_context.h
> +++ b/src/mesa/state_tracker/st_context.h
> @@ -133,20 +133,23 @@ struct st_context
> GLuint poly_stipple[32]; /**< In OpenGL's bottom-to-top order */
>
> GLuint fb_orientation;
> } state;
>
> char vendor[100];
> char renderer[100];
>
> uint64_t dirty; /**< dirty states */
>
> + /** This masks out unused shader resources. Only valid in draw calls. */
> + uint64_t active_states;
> +
> /* If true, further analysis of states is required to know if something
> * has changed. Used mainly for shaders.
> */
> bool gfx_shaders_may_be_dirty;
> bool compute_shader_may_be_dirty;
>
> GLboolean vertdata_edgeflags;
> GLboolean edgeflag_culls_prims;
>
> /** Mapping from VARYING_SLOT_x to post-transformed vertex slot */
> @@ -350,16 +353,19 @@ st_user_clip_planes_enabled(struct gl_context *ctx)
>
> extern struct st_context *
> st_create_context(gl_api api, struct pipe_context *pipe,
> const struct gl_config *visual,
> struct st_context *share,
> const struct st_config_options *options);
>
> extern void
> st_destroy_context(struct st_context *st);
>
> +uint64_t
> +st_get_active_states(struct gl_context *ctx);
> +
>
> #ifdef __cplusplus
> }
> #endif
>
> #endif
>
More information about the mesa-dev
mailing list