freedreno: support start param for sampler views/states
authorRob Clark <robclark@freedesktop.org>
Sat, 11 Jun 2016 16:59:00 +0000 (12:59 -0400)
committerRob Clark <robclark@freedesktop.org>
Tue, 14 Jun 2016 15:00:59 +0000 (11:00 -0400)
Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/freedreno_context.h
src/gallium/drivers/freedreno/freedreno_texture.c

index 5861fbe..7ce2920 100644 (file)
@@ -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 {
index a301811..b506595 100644 (file)
@@ -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: