[Mesa-dev] [PATCH 19/20] st/mesa: don't store non-fragment sampler states and views in st_context

Marek Olšák maraeo at gmail.com
Tue Nov 21 18:02:01 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

those are unused.

st_context: 10120 -> 3704 bytes
---
 src/mesa/state_tracker/st_atom_sampler.c  | 35 +++++++++----------
 src/mesa/state_tracker/st_atom_texture.c  | 56 +++++++++++++++++--------------
 src/mesa/state_tracker/st_cb_bitmap.c     |  8 ++---
 src/mesa/state_tracker/st_cb_drawpixels.c |  8 ++---
 src/mesa/state_tracker/st_context.c       | 10 +++---
 src/mesa/state_tracker/st_context.h       |  6 ++--
 6 files changed, 61 insertions(+), 62 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 6d83f96..289856c 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -251,27 +251,32 @@ update_shader_samplers(struct st_context *st,
                        enum pipe_shader_type shader_stage,
                        const struct gl_program *prog,
                        struct pipe_sampler_state *samplers,
                        unsigned *out_num_samplers)
 {
    struct gl_context *ctx = st->ctx;
    GLbitfield samplers_used = prog->SamplersUsed;
    GLbitfield free_slots = ~prog->SamplersUsed;
    GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
    unsigned unit, num_samplers;
+   struct pipe_sampler_state local_samplers[PIPE_MAX_SAMPLERS];
    const struct pipe_sampler_state *states[PIPE_MAX_SAMPLERS];
 
    if (samplers_used == 0x0) {
-      *out_num_samplers = 0;
+      if (out_num_samplers)
+         *out_num_samplers = 0;
       return;
    }
 
+   if (!samplers)
+      samplers = local_samplers;
+
    num_samplers = util_last_bit(samplers_used);
 
    /* loop over sampler units (aka tex image units) */
    for (unit = 0; samplers_used; unit++, samplers_used >>= 1) {
       struct pipe_sampler_state *sampler = samplers + unit;
       unsigned tex_unit = prog->SamplerUnits[unit];
 
       /* Don't update the sampler for TBOs. cso_context will not bind sampler
        * states that are NULL.
        */
@@ -313,98 +318,90 @@ update_shader_samplers(struct st_context *st,
          states[extra] = sampler;
          break;
       default:
          break;
       }
 
       num_samplers = MAX2(num_samplers, extra + 1);
    }
 
    cso_set_samplers(st->cso_context, shader_stage, num_samplers, states);
-   *out_num_samplers = num_samplers;
+
+   if (out_num_samplers)
+      *out_num_samplers = num_samplers;
 }
 
 
 void
 st_update_vertex_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    update_shader_samplers(st,
                           PIPE_SHADER_VERTEX,
-                          ctx->VertexProgram._Current,
-                          st->state.samplers[PIPE_SHADER_VERTEX],
-                          &st->state.num_samplers[PIPE_SHADER_VERTEX]);
+                          ctx->VertexProgram._Current, NULL, NULL);
 }
 
 
 void
 st_update_tessctrl_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->TessCtrlProgram._Current) {
       update_shader_samplers(st,
                              PIPE_SHADER_TESS_CTRL,
-                             ctx->TessCtrlProgram._Current,
-                             st->state.samplers[PIPE_SHADER_TESS_CTRL],
-                             &st->state.num_samplers[PIPE_SHADER_TESS_CTRL]);
+                             ctx->TessCtrlProgram._Current, NULL, NULL);
    }
 }
 
 
 void
 st_update_tesseval_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->TessEvalProgram._Current) {
       update_shader_samplers(st,
                              PIPE_SHADER_TESS_EVAL,
-                             ctx->TessEvalProgram._Current,
-                             st->state.samplers[PIPE_SHADER_TESS_EVAL],
-                             &st->state.num_samplers[PIPE_SHADER_TESS_EVAL]);
+                             ctx->TessEvalProgram._Current, NULL, NULL);
    }
 }
 
 
 void
 st_update_geometry_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->GeometryProgram._Current) {
       update_shader_samplers(st,
                              PIPE_SHADER_GEOMETRY,
-                             ctx->GeometryProgram._Current,
-                             st->state.samplers[PIPE_SHADER_GEOMETRY],
-                             &st->state.num_samplers[PIPE_SHADER_GEOMETRY]);
+                             ctx->GeometryProgram._Current, NULL, NULL);
    }
 }
 
 
 void
 st_update_fragment_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    update_shader_samplers(st,
                           PIPE_SHADER_FRAGMENT,
                           ctx->FragmentProgram._Current,
-                          st->state.samplers[PIPE_SHADER_FRAGMENT],
-                          &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
+                          st->state.frag_samplers,
+                          &st->state.num_frag_samplers);
 }
 
 
 void
 st_update_compute_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->ComputeProgram._Current) {
       update_shader_samplers(st,
                              PIPE_SHADER_COMPUTE,
-                             ctx->ComputeProgram._Current,
-                             st->state.samplers[PIPE_SHADER_COMPUTE],
-                             &st->state.num_samplers[PIPE_SHADER_COMPUTE]);
+                             ctx->ComputeProgram._Current, NULL, NULL);
    }
 }
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index 6c26b77..105fa79 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -209,98 +209,102 @@ update_textures(struct st_context *st,
       num_textures = MAX2(num_textures, extra + 1);
    }
 
    cso_set_sampler_views(st->cso_context,
                          shader_stage,
                          num_textures,
                          sampler_views);
    *out_num_textures = num_textures;
 }
 
+/* Same as update_textures, but don't store the views in st_context. */
+static void
+update_textures_local(struct st_context *st,
+                      enum pipe_shader_type shader_stage,
+                      const struct gl_program *prog,
+                      unsigned *out_num_textures)
+{
+   struct pipe_sampler_view *local_views[PIPE_MAX_SAMPLERS] = {0};
 
+   update_textures(st, shader_stage, prog, local_views, out_num_textures);
+
+   unsigned num = *out_num_textures;
+   for (unsigned i = 0; i < num; i++)
+      pipe_sampler_view_reference(&local_views[i], NULL);
+}
 
 void
 st_update_vertex_textures(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
-      update_textures(st,
-                      PIPE_SHADER_VERTEX,
-                      ctx->VertexProgram._Current,
-                      st->state.sampler_views[PIPE_SHADER_VERTEX],
-                      &st->state.num_sampler_views[PIPE_SHADER_VERTEX]);
+      update_textures_local(st, PIPE_SHADER_VERTEX,
+                            ctx->VertexProgram._Current,
+                            &st->state.num_sampler_views[PIPE_SHADER_VERTEX]);
    }
 }
 
 
 void
 st_update_fragment_textures(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    update_textures(st,
                    PIPE_SHADER_FRAGMENT,
                    ctx->FragmentProgram._Current,
-                   st->state.sampler_views[PIPE_SHADER_FRAGMENT],
+                   st->state.frag_sampler_views,
                    &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
 }
 
 
 void
 st_update_geometry_textures(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->GeometryProgram._Current) {
-      update_textures(st,
-                      PIPE_SHADER_GEOMETRY,
-                      ctx->GeometryProgram._Current,
-                      st->state.sampler_views[PIPE_SHADER_GEOMETRY],
-                      &st->state.num_sampler_views[PIPE_SHADER_GEOMETRY]);
+      update_textures_local(st, PIPE_SHADER_GEOMETRY,
+                            ctx->GeometryProgram._Current,
+                            &st->state.num_sampler_views[PIPE_SHADER_GEOMETRY]);
    }
 }
 
 
 void
 st_update_tessctrl_textures(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->TessCtrlProgram._Current) {
-      update_textures(st,
-                      PIPE_SHADER_TESS_CTRL,
-                      ctx->TessCtrlProgram._Current,
-                      st->state.sampler_views[PIPE_SHADER_TESS_CTRL],
-                      &st->state.num_sampler_views[PIPE_SHADER_TESS_CTRL]);
+      update_textures_local(st, PIPE_SHADER_TESS_CTRL,
+                            ctx->TessCtrlProgram._Current,
+                            &st->state.num_sampler_views[PIPE_SHADER_TESS_CTRL]);
    }
 }
 
 
 void
 st_update_tesseval_textures(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->TessEvalProgram._Current) {
-      update_textures(st,
-                      PIPE_SHADER_TESS_EVAL,
-                      ctx->TessEvalProgram._Current,
-                      st->state.sampler_views[PIPE_SHADER_TESS_EVAL],
-                      &st->state.num_sampler_views[PIPE_SHADER_TESS_EVAL]);
+      update_textures_local(st, PIPE_SHADER_TESS_EVAL,
+                            ctx->TessEvalProgram._Current,
+                            &st->state.num_sampler_views[PIPE_SHADER_TESS_EVAL]);
    }
 }
 
 
 void
 st_update_compute_textures(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
    if (ctx->ComputeProgram._Current) {
-      update_textures(st,
-                      PIPE_SHADER_COMPUTE,
-                      ctx->ComputeProgram._Current,
-                      st->state.sampler_views[PIPE_SHADER_COMPUTE],
-                      &st->state.num_sampler_views[PIPE_SHADER_COMPUTE]);
+      update_textures_local(st, PIPE_SHADER_COMPUTE,
+                            ctx->ComputeProgram._Current,
+                            &st->state.num_sampler_views[PIPE_SHADER_COMPUTE]);
    }
 }
diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c
index a5c7ed0..0a30ffa 100644
--- a/src/mesa/state_tracker/st_cb_bitmap.c
+++ b/src/mesa/state_tracker/st_cb_bitmap.c
@@ -217,39 +217,39 @@ setup_render_state(struct gl_context *ctx,
 
    /* disable other shaders */
    cso_set_tessctrl_shader_handle(cso, NULL);
    cso_set_tesseval_shader_handle(cso, NULL);
    cso_set_geometry_shader_handle(cso, NULL);
 
    /* user samplers, plus our bitmap sampler */
    {
       struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
       uint num = MAX2(fpv->bitmap_sampler + 1,
-                      st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
+                      st->state.num_frag_samplers);
       uint i;
-      for (i = 0; i < st->state.num_samplers[PIPE_SHADER_FRAGMENT]; i++) {
-         samplers[i] = &st->state.samplers[PIPE_SHADER_FRAGMENT][i];
+      for (i = 0; i < st->state.num_frag_samplers; i++) {
+         samplers[i] = &st->state.frag_samplers[i];
       }
       if (atlas)
          samplers[fpv->bitmap_sampler] = &st->bitmap.atlas_sampler;
       else
          samplers[fpv->bitmap_sampler] = &st->bitmap.sampler;
       cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, num,
                        (const struct pipe_sampler_state **) samplers);
    }
 
    /* user textures, plus the bitmap texture */
    {
       struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
       uint num = MAX2(fpv->bitmap_sampler + 1,
                       st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
-      memcpy(sampler_views, st->state.sampler_views[PIPE_SHADER_FRAGMENT],
+      memcpy(sampler_views, st->state.frag_sampler_views,
              sizeof(sampler_views));
       sampler_views[fpv->bitmap_sampler] = sv;
       cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, num, sampler_views);
    }
 
    /* viewport state: viewport matching window dims */
    cso_set_viewport_dims(cso, st->state.fb_width,
                          st->state.fb_height,
                          st->state.fb_orientation == Y_0_TOP);
 
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index 1d88976..7693b2f 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -659,25 +659,25 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
       sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
       sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
       sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
       sampler.normalized_coords = normalized;
 
       if (fpv) {
          /* drawing a color image */
          const struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
          uint num = MAX3(fpv->drawpix_sampler + 1,
                          fpv->pixelmap_sampler + 1,
-                         st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
+                         st->state.num_frag_samplers);
          uint i;
 
-         for (i = 0; i < st->state.num_samplers[PIPE_SHADER_FRAGMENT]; i++)
-            samplers[i] = &st->state.samplers[PIPE_SHADER_FRAGMENT][i];
+         for (i = 0; i < st->state.num_frag_samplers; i++)
+            samplers[i] = &st->state.frag_samplers[i];
 
          samplers[fpv->drawpix_sampler] = &sampler;
          if (sv[1])
             samplers[fpv->pixelmap_sampler] = &sampler;
 
          cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, num, samplers);
       } else {
          /* drawing a depth/stencil image */
          const struct pipe_sampler_state *samplers[2] = {&sampler, &sampler};
 
@@ -686,21 +686,21 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
    }
 
    /* user textures, plus the drawpix textures */
    if (fpv) {
       /* drawing a color image */
       struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
       uint num = MAX3(fpv->drawpix_sampler + 1,
                       fpv->pixelmap_sampler + 1,
                       st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
 
-      memcpy(sampler_views, st->state.sampler_views[PIPE_SHADER_FRAGMENT],
+      memcpy(sampler_views, st->state.frag_sampler_views,
              sizeof(sampler_views));
 
       sampler_views[fpv->drawpix_sampler] = sv[0];
       if (sv[1])
          sampler_views[fpv->pixelmap_sampler] = sv[1];
       cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, num, sampler_views);
    } else {
       /* drawing a depth/stencil image */
       cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, num_sampler_view, sv);
    }
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index da1cca4..c65bd20 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -245,38 +245,36 @@ st_invalidate_state(struct gl_context *ctx)
           ctx->FragmentProgram._Current->ExternalSamplersUsed) {
          st->dirty |= ST_NEW_FS_STATE;
       }
    }
 }
 
 
 static void
 st_destroy_context_priv(struct st_context *st, bool destroy_pipe)
 {
-   uint shader, i;
+   uint i;
 
    st_destroy_atoms(st);
    st_destroy_draw(st);
    st_destroy_clear(st);
    st_destroy_bitmap(st);
    st_destroy_drawpix(st);
    st_destroy_drawtex(st);
    st_destroy_perfmon(st);
    st_destroy_pbo_helpers(st);
    st_destroy_bound_texture_handles(st);
    st_destroy_bound_image_handles(st);
 
-   for (shader = 0; shader < ARRAY_SIZE(st->state.sampler_views); shader++) {
-      for (i = 0; i < ARRAY_SIZE(st->state.sampler_views[0]); i++) {
-         pipe_sampler_view_release(st->pipe,
-                                   &st->state.sampler_views[shader][i]);
-      }
+   for (i = 0; i < ARRAY_SIZE(st->state.frag_sampler_views); i++) {
+      pipe_sampler_view_release(st->pipe,
+                                &st->state.frag_sampler_views[i]);
    }
 
    /* free glDrawPixels cache data */
    free(st->drawpix_cache.image);
    pipe_resource_reference(&st->drawpix_cache.texture, NULL);
 
    /* free glReadPixels cache data */
    st_invalidate_readpix_cache(st);
 
    cso_destroy_context(st->cso_context);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 9f33eed..f1da18b 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -131,23 +131,23 @@ struct st_context
    boolean vertex_array_out_of_memory;
    boolean has_hw_atomics;
 
    /* Some state is contained in constant objects.
     * Other state is just parameter values.
     */
    struct {
       struct pipe_blend_state               blend;
       struct pipe_depth_stencil_alpha_state depth_stencil;
       struct pipe_rasterizer_state          rasterizer;
-      struct pipe_sampler_state samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
-      GLuint num_samplers[PIPE_SHADER_TYPES];
-      struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
+      struct pipe_sampler_state frag_samplers[PIPE_MAX_SAMPLERS];
+      GLuint num_frag_samplers;
+      struct pipe_sampler_view *frag_sampler_views[PIPE_MAX_SAMPLERS];
       GLuint num_sampler_views[PIPE_SHADER_TYPES];
       struct pipe_clip_state clip;
       struct {
          void *ptr;
          unsigned size;
       } constants[PIPE_SHADER_TYPES];
       unsigned fb_width;
       unsigned fb_height;
       unsigned fb_num_samples;
       unsigned fb_num_layers;
-- 
2.7.4



More information about the mesa-dev mailing list