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

Author: Rob Clark <robcl...@freedesktop.org>
Date:   Sat Jun 11 12:59:00 2016 -0400

freedreno: support start param for sampler views/states

Signed-off-by: Rob Clark <robcl...@freedesktop.org>

---

 src/gallium/drivers/freedreno/freedreno_context.h |  3 +-
 src/gallium/drivers/freedreno/freedreno_texture.c | 53 +++++++++--------------
 2 files changed, 23 insertions(+), 33 deletions(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_context.h 
b/src/gallium/drivers/freedreno/freedreno_context.h
index 5861fbe8..7ce2920 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.h
+++ b/src/gallium/drivers/freedreno/freedreno_context.h
@@ -47,9 +47,10 @@ struct fd_vertex_stateobj;
 struct fd_texture_stateobj {
        struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS];
        unsigned num_textures;
+       unsigned valid_textures;
        struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
        unsigned num_samplers;
-       unsigned dirty_samplers;
+       unsigned valid_samplers;
 };
 
 struct fd_program_stateobj {
diff --git a/src/gallium/drivers/freedreno/freedreno_texture.c 
b/src/gallium/drivers/freedreno/freedreno_texture.c
index a301811..b506595 100644
--- a/src/gallium/drivers/freedreno/freedreno_texture.c
+++ b/src/gallium/drivers/freedreno/freedreno_texture.c
@@ -50,45 +50,38 @@ fd_sampler_view_destroy(struct pipe_context *pctx,
 }
 
 static void bind_sampler_states(struct fd_texture_stateobj *tex,
-               unsigned nr, void **hwcso)
+               unsigned start, unsigned nr, void **hwcso)
 {
        unsigned i;
-       unsigned new_nr = 0;
 
        for (i = 0; i < nr; i++) {
-               if (hwcso[i])
-                       new_nr = i + 1;
-               tex->samplers[i] = hwcso[i];
-               tex->dirty_samplers |= (1 << i);
-       }
-
-       for (; i < tex->num_samplers; i++) {
-               tex->samplers[i] = NULL;
-               tex->dirty_samplers |= (1 << i);
+               unsigned p = i + start;
+               tex->samplers[p] = hwcso[i];
+               if (tex->samplers[p])
+                       tex->valid_samplers |= (1 << p);
+               else
+                       tex->valid_samplers &= ~(1 << p);
        }
 
-       tex->num_samplers = new_nr;
+       tex->num_samplers = util_last_bit(tex->valid_samplers);
 }
 
 static void set_sampler_views(struct fd_texture_stateobj *tex,
-               unsigned nr, struct pipe_sampler_view **views)
+               unsigned start, unsigned nr, struct pipe_sampler_view **views)
 {
        unsigned i;
-       unsigned new_nr = 0;
 
        for (i = 0; i < nr; i++) {
-               if (views[i])
-                       new_nr = i + 1;
-               pipe_sampler_view_reference(&tex->textures[i], views[i]);
-               tex->dirty_samplers |= (1 << i);
+               struct pipe_sampler_view *view = views ? views[i] : NULL;
+               unsigned p = i + start;
+               pipe_sampler_view_reference(&tex->textures[p], view);
+               if (tex->textures[p])
+                       tex->valid_textures |= (1 << p);
+               else
+                       tex->valid_textures &= ~(1 << p);
        }
 
-       for (; i < tex->num_textures; i++) {
-               pipe_sampler_view_reference(&tex->textures[i], NULL);
-               tex->dirty_samplers |= (1 << i);
-       }
-
-       tex->num_textures = new_nr;
+       tex->num_textures = util_last_bit(tex->valid_textures);
 }
 
 void
@@ -98,14 +91,12 @@ fd_sampler_states_bind(struct pipe_context *pctx,
 {
        struct fd_context *ctx = fd_context(pctx);
 
-       assert(start == 0);
-
        if (shader == PIPE_SHADER_FRAGMENT) {
-               bind_sampler_states(&ctx->fragtex, nr, hwcso);
+               bind_sampler_states(&ctx->fragtex, start, nr, hwcso);
                ctx->dirty |= FD_DIRTY_FRAGTEX;
        }
        else if (shader == PIPE_SHADER_VERTEX) {
-               bind_sampler_states(&ctx->verttex, nr, hwcso);
+               bind_sampler_states(&ctx->verttex, start, nr, hwcso);
                ctx->dirty |= FD_DIRTY_VERTTEX;
        }
 }
@@ -117,8 +108,6 @@ fd_set_sampler_views(struct pipe_context *pctx, unsigned 
shader,
 {
        struct fd_context *ctx = fd_context(pctx);
 
-       assert(start == 0);
-
        switch (shader) {
        case PIPE_SHADER_FRAGMENT:
                /* on a2xx, since there is a flat address space for 
textures/samplers,
@@ -130,11 +119,11 @@ fd_set_sampler_views(struct pipe_context *pctx, unsigned 
shader,
                if (nr != ctx->fragtex.num_textures)
                        ctx->dirty |= FD_DIRTY_TEXSTATE;
 
-               set_sampler_views(&ctx->fragtex, nr, views);
+               set_sampler_views(&ctx->fragtex, start, nr, views);
                ctx->dirty |= FD_DIRTY_FRAGTEX;
                break;
        case PIPE_SHADER_VERTEX:
-               set_sampler_views(&ctx->verttex, nr, views);
+               set_sampler_views(&ctx->verttex, start, nr, views);
                ctx->dirty |= FD_DIRTY_VERTTEX;
                break;
        default:

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

Reply via email to