On 07.08.2016 03:12, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to