Mesa (master): softpipe: consolidate vert/frag/ geom sampler setting functions

Brian Paul brianp at kemper.freedesktop.org
Mon Aug 6 14:34:58 UTC 2012


Module: Mesa
Branch: master
Commit: 1f34e1a6cbac4b96d07a3d6d01bc443d5282add4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1f34e1a6cbac4b96d07a3d6d01bc443d5282add4

Author: Brian Paul <brianp at vmware.com>
Date:   Sat Aug  4 08:46:41 2012 -0600

softpipe: consolidate vert/frag/geom sampler setting functions

The functions for setting samplers and sampler views for vertex,
fragment and geometry shaders were nearly identical.  Now they
use shared code.

In the future, if the pipe_context functions for setting samplers
and sampler views for vert/frag/geom/compute are combined, this
will make updating the softpipe driver a snap.

Reviewed-by: José Fonseca <jfonseca at vmware.com>

---

 src/gallium/drivers/softpipe/sp_state_sampler.c |  166 ++++++++---------------
 1 files changed, 54 insertions(+), 112 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_state_sampler.c b/src/gallium/drivers/softpipe/sp_state_sampler.c
index 70b9c60..93ae917 100644
--- a/src/gallium/drivers/softpipe/sp_state_sampler.c
+++ b/src/gallium/drivers/softpipe/sp_state_sampler.c
@@ -67,88 +67,63 @@ softpipe_create_sampler_state(struct pipe_context *pipe,
 
 
 static void
-softpipe_bind_fragment_sampler_states(struct pipe_context *pipe,
-                                      unsigned num, void **sampler)
+softpipe_bind_sampler_states(struct pipe_context *pipe,
+                             unsigned shader, unsigned num, void **sampler)
 {
    struct softpipe_context *softpipe = softpipe_context(pipe);
    unsigned i;
 
+   assert(shader < PIPE_SHADER_TYPES);
    assert(num <= PIPE_MAX_SAMPLERS);
 
    /* Check for no-op */
-   if (num == softpipe->num_samplers[PIPE_SHADER_FRAGMENT] &&
-       !memcmp(softpipe->samplers[PIPE_SHADER_FRAGMENT], sampler, num * sizeof(void *)))
+   if (num == softpipe->num_samplers[shader] &&
+       !memcmp(softpipe->samplers[shader], sampler, num * sizeof(void *)))
       return;
 
    draw_flush(softpipe->draw);
 
    for (i = 0; i < num; ++i)
-      softpipe->samplers[PIPE_SHADER_FRAGMENT][i] = sampler[i];
+      softpipe->samplers[shader][i] = sampler[i];
    for (i = num; i < PIPE_MAX_SAMPLERS; ++i)
-      softpipe->samplers[PIPE_SHADER_FRAGMENT][i] = NULL;
+      softpipe->samplers[shader][i] = NULL;
+
+   softpipe->num_samplers[shader] = num;
 
-   softpipe->num_samplers[PIPE_SHADER_FRAGMENT] = num;
+   if (shader == PIPE_SHADER_VERTEX) {
+      draw_set_samplers(softpipe->draw,
+                        softpipe->samplers[PIPE_SHADER_VERTEX],
+                        softpipe->num_samplers[PIPE_SHADER_VERTEX]);
+   }
 
    softpipe->dirty |= SP_NEW_SAMPLER;
 }
 
 
+
 static void
-softpipe_bind_vertex_sampler_states(struct pipe_context *pipe,
-                                    unsigned num_samplers,
-                                    void **samplers)
+softpipe_bind_fragment_sampler_states(struct pipe_context *pipe,
+                                      unsigned num, void **samplers)
 {
-   struct softpipe_context *softpipe = softpipe_context(pipe);
-   unsigned i;
-
-   assert(num_samplers <= PIPE_MAX_VERTEX_SAMPLERS);
-
-   /* Check for no-op */
-   if (num_samplers == softpipe->num_samplers[PIPE_SHADER_VERTEX] &&
-       !memcmp(softpipe->samplers[PIPE_SHADER_VERTEX], samplers, num_samplers * sizeof(void *)))
-      return;
-
-   draw_flush(softpipe->draw);
-
-   for (i = 0; i < num_samplers; ++i)
-      softpipe->samplers[PIPE_SHADER_VERTEX][i] = samplers[i];
-   for (i = num_samplers; i < PIPE_MAX_VERTEX_SAMPLERS; ++i)
-      softpipe->samplers[PIPE_SHADER_VERTEX][i] = NULL;
-
-   softpipe->num_samplers[PIPE_SHADER_VERTEX] = num_samplers;
+   softpipe_bind_sampler_states(pipe, PIPE_SHADER_FRAGMENT, num, samplers);
+}
 
-   draw_set_samplers(softpipe->draw,
-                     softpipe->samplers[PIPE_SHADER_VERTEX],
-                     softpipe->num_samplers[PIPE_SHADER_VERTEX]);
 
-   softpipe->dirty |= SP_NEW_SAMPLER;
+static void
+softpipe_bind_vertex_sampler_states(struct pipe_context *pipe,
+                                    unsigned num,
+                                    void **samplers)
+{
+   softpipe_bind_sampler_states(pipe, PIPE_SHADER_VERTEX, num, samplers);
 }
 
+
 static void
 softpipe_bind_geometry_sampler_states(struct pipe_context *pipe,
-                                      unsigned num_samplers,
+                                      unsigned num,
                                       void **samplers)
 {
-   struct softpipe_context *softpipe = softpipe_context(pipe);
-   unsigned i;
-
-   assert(num_samplers <= PIPE_MAX_GEOMETRY_SAMPLERS);
-
-   /* Check for no-op */
-   if (num_samplers == softpipe->num_samplers[PIPE_SHADER_GEOMETRY] &&
-       !memcmp(softpipe->samplers[PIPE_SHADER_GEOMETRY], samplers, num_samplers * sizeof(void *)))
-      return;
-
-   draw_flush(softpipe->draw);
-
-   for (i = 0; i < num_samplers; ++i)
-      softpipe->samplers[PIPE_SHADER_GEOMETRY][i] = samplers[i];
-   for (i = num_samplers; i < PIPE_MAX_SAMPLERS; ++i)
-      softpipe->samplers[PIPE_SHADER_GEOMETRY][i] = NULL;
-
-   softpipe->num_samplers[PIPE_SHADER_GEOMETRY] = num_samplers;
-
-   softpipe->dirty |= SP_NEW_SAMPLER;
+   softpipe_bind_sampler_states(pipe, PIPE_SHADER_GEOMETRY, num, samplers);
 }
 
 
@@ -181,9 +156,10 @@ softpipe_sampler_view_destroy(struct pipe_context *pipe,
 
 
 static void
-softpipe_set_fragment_sampler_views(struct pipe_context *pipe,
-                                    unsigned num,
-                                    struct pipe_sampler_view **views)
+softpipe_set_sampler_views(struct pipe_context *pipe,
+                           unsigned shader,
+                           unsigned num,
+                           struct pipe_sampler_view **views)
 {
    struct softpipe_context *softpipe = softpipe_context(pipe);
    uint i;
@@ -191,8 +167,8 @@ softpipe_set_fragment_sampler_views(struct pipe_context *pipe,
    assert(num <= PIPE_MAX_SAMPLERS);
 
    /* Check for no-op */
-   if (num == softpipe->num_sampler_views[PIPE_SHADER_FRAGMENT] &&
-       !memcmp(softpipe->sampler_views[PIPE_SHADER_FRAGMENT], views,
+   if (num == softpipe->num_sampler_views[shader] &&
+       !memcmp(softpipe->sampler_views[shader], views,
                num * sizeof(struct pipe_sampler_view *)))
       return;
 
@@ -201,49 +177,37 @@ softpipe_set_fragment_sampler_views(struct pipe_context *pipe,
    for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
       struct pipe_sampler_view *view = i < num ? views[i] : NULL;
 
-      pipe_sampler_view_reference(&softpipe->sampler_views[PIPE_SHADER_FRAGMENT][i], view);
-      sp_tex_tile_cache_set_sampler_view(softpipe->tex_cache[PIPE_SHADER_FRAGMENT][i], view);
+      pipe_sampler_view_reference(&softpipe->sampler_views[shader][i], view);
+      sp_tex_tile_cache_set_sampler_view(softpipe->tex_cache[shader][i], view);
    }
 
-   softpipe->num_sampler_views[PIPE_SHADER_FRAGMENT] = num;
+   softpipe->num_sampler_views[shader] = num;
+
+   if (shader == PIPE_SHADER_VERTEX) {
+      draw_set_sampler_views(softpipe->draw,
+                             softpipe->sampler_views[PIPE_SHADER_VERTEX],
+                             softpipe->num_sampler_views[PIPE_SHADER_VERTEX]);
+   }
 
    softpipe->dirty |= SP_NEW_TEXTURE;
 }
 
 
 static void
+softpipe_set_fragment_sampler_views(struct pipe_context *pipe,
+                                    unsigned num,
+                                    struct pipe_sampler_view **views)
+{
+   softpipe_set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, num, views);
+}
+
+
+static void
 softpipe_set_vertex_sampler_views(struct pipe_context *pipe,
                                   unsigned num,
                                   struct pipe_sampler_view **views)
 {
-   struct softpipe_context *softpipe = softpipe_context(pipe);
-   uint i;
-
-   assert(num <= PIPE_MAX_VERTEX_SAMPLERS);
-
-   /* Check for no-op */
-   if (num == softpipe->num_sampler_views[PIPE_SHADER_VERTEX] &&
-       !memcmp(softpipe->sampler_views[PIPE_SHADER_VERTEX],
-               views, num * sizeof(struct pipe_sampler_view *))) {
-      return;
-   }
-
-   draw_flush(softpipe->draw);
-
-   for (i = 0; i < PIPE_MAX_VERTEX_SAMPLERS; i++) {
-      struct pipe_sampler_view *view = i < num ? views[i] : NULL;
-
-      pipe_sampler_view_reference(&softpipe->sampler_views[PIPE_SHADER_VERTEX][i], view);
-      sp_tex_tile_cache_set_sampler_view(softpipe->tex_cache[PIPE_SHADER_VERTEX][i], view);
-   }
-
-   softpipe->num_sampler_views[PIPE_SHADER_VERTEX] = num;
-
-   draw_set_sampler_views(softpipe->draw,
-                          softpipe->sampler_views[PIPE_SHADER_VERTEX],
-                          softpipe->num_sampler_views[PIPE_SHADER_VERTEX]);
-
-   softpipe->dirty |= SP_NEW_TEXTURE;
+   softpipe_set_sampler_views(pipe, PIPE_SHADER_VERTEX, num, views);
 }
 
 
@@ -252,29 +216,7 @@ softpipe_set_geometry_sampler_views(struct pipe_context *pipe,
                                     unsigned num,
                                     struct pipe_sampler_view **views)
 {
-   struct softpipe_context *softpipe = softpipe_context(pipe);
-   uint i;
-
-   assert(num <= PIPE_MAX_GEOMETRY_SAMPLERS);
-
-   /* Check for no-op */
-   if (num == softpipe->num_sampler_views[PIPE_SHADER_GEOMETRY] &&
-       !memcmp(softpipe->sampler_views[PIPE_SHADER_GEOMETRY], views, num * sizeof(struct pipe_sampler_view *))) {
-      return;
-   }
-
-   draw_flush(softpipe->draw);
-
-   for (i = 0; i < PIPE_MAX_GEOMETRY_SAMPLERS; i++) {
-      struct pipe_sampler_view *view = i < num ? views[i] : NULL;
-
-      pipe_sampler_view_reference(&softpipe->sampler_views[PIPE_SHADER_GEOMETRY][i], view);
-      sp_tex_tile_cache_set_sampler_view(softpipe->tex_cache[PIPE_SHADER_GEOMETRY][i], view);
-   }
-
-   softpipe->num_sampler_views[PIPE_SHADER_GEOMETRY] = num;
-
-   softpipe->dirty |= SP_NEW_TEXTURE;
+   softpipe_set_sampler_views(pipe, PIPE_SHADER_GEOMETRY, num, views);
 }
 
 




More information about the mesa-commit mailing list