freedreno: make texture state an array
authorRob Clark <robdclark@gmail.com>
Sun, 16 Apr 2017 15:49:54 +0000 (11:49 -0400)
committerRob Clark <robdclark@gmail.com>
Tue, 18 Apr 2017 20:32:00 +0000 (16:32 -0400)
Make this an array indexed by shader stage, as is done elsewhere for
other per-shader-stage state.  This will simplify things as more shader
stages are eventually added.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a2xx/fd2_emit.c
src/gallium/drivers/freedreno/a2xx/fd2_program.c
src/gallium/drivers/freedreno/a2xx/fd2_texture.c
src/gallium/drivers/freedreno/a3xx/fd3_emit.c
src/gallium/drivers/freedreno/a4xx/fd4_emit.c
src/gallium/drivers/freedreno/a5xx/fd5_emit.c
src/gallium/drivers/freedreno/freedreno_context.h
src/gallium/drivers/freedreno/freedreno_draw.c
src/gallium/drivers/freedreno/freedreno_resource.c
src/gallium/drivers/freedreno/freedreno_texture.c

index b3a1b3d29ab079ed788d5188851f0d31a914e0da..5193b896ffce18d5c6f5b0ee8f08a41dc9191011 100644 (file)
@@ -152,16 +152,18 @@ emit_texture(struct fd_ringbuffer *ring, struct fd_context *ctx,
 static void
 emit_textures(struct fd_ringbuffer *ring, struct fd_context *ctx)
 {
+       struct fd_texture_stateobj *fragtex = &ctx->tex[PIPE_SHADER_FRAGMENT];
+       struct fd_texture_stateobj *verttex = &ctx->tex[PIPE_SHADER_VERTEX];
        texmask emitted = 0;
        unsigned i;
 
-       for (i = 0; i < ctx->verttex.num_samplers; i++)
-               if (ctx->verttex.samplers[i])
-                       emitted |= emit_texture(ring, ctx, &ctx->verttex, i, emitted);
+       for (i = 0; i < verttex->num_samplers; i++)
+               if (verttex->samplers[i])
+                       emitted |= emit_texture(ring, ctx, verttex, i, emitted);
 
-       for (i = 0; i < ctx->fragtex.num_samplers; i++)
-               if (ctx->fragtex.samplers[i])
-                       emitted |= emit_texture(ring, ctx, &ctx->fragtex, i, emitted);
+       for (i = 0; i < fragtex->num_samplers; i++)
+               if (fragtex->samplers[i])
+                       emitted |= emit_texture(ring, ctx, fragtex, i, emitted);
 }
 
 void
index 4f317721db0a764dad5fe9cbce3bf23cb3a568c4..8dcbb979383d504971b909049ab7d2139e3c56d2 100644 (file)
@@ -259,8 +259,8 @@ fd2_program_validate(struct fd_context *ctx)
 
        /* if necessary, fix up texture fetch instructions: */
        if (ctx->dirty & (FD_DIRTY_TEXSTATE | FD_DIRTY_PROG)) {
-               patch_tex_fetches(ctx, prog->vp, &ctx->verttex);
-               patch_tex_fetches(ctx, prog->fp, &ctx->fragtex);
+               patch_tex_fetches(ctx, prog->vp, &ctx->tex[PIPE_SHADER_VERTEX]);
+               patch_tex_fetches(ctx, prog->fp, &ctx->tex[PIPE_SHADER_FRAGMENT]);
        }
 }
 
index 932383a528e75b6f1f03036c8a7c36ecb5c680be..c500fbc9b87822f07a3170087ee4d75ec3c5a918 100644 (file)
@@ -116,7 +116,7 @@ fd2_sampler_states_bind(struct pipe_context *pctx,
                 * a change in # of fragment textures/samplers will trigger patching and
                 * re-emitting the vertex shader:
                 */
-               if (nr != ctx->fragtex.num_samplers)
+               if (nr != ctx->tex[PIPE_SHADER_FRAGMENT].num_samplers)
                        ctx->dirty |= FD_DIRTY_TEXSTATE;
        }
 
@@ -166,9 +166,9 @@ unsigned
 fd2_get_const_idx(struct fd_context *ctx, struct fd_texture_stateobj *tex,
                unsigned samp_id)
 {
-       if (tex == &ctx->fragtex)
+       if (tex == &ctx->tex[PIPE_SHADER_FRAGMENT])
                return samp_id;
-       return samp_id + ctx->fragtex.num_samplers;
+       return samp_id + ctx->tex[PIPE_SHADER_FRAGMENT].num_samplers;
 }
 
 void
index 6c3458a3b08704797cea62acf4e3cf5fb929edd7..377085e7159eac1a12ff152c4fe6b789eba5ad41 100644 (file)
@@ -788,14 +788,14 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
 
        if (dirty & FD_DIRTY_VERTTEX) {
                if (vp->has_samp)
-                       emit_textures(ctx, ring, SB_VERT_TEX, &ctx->verttex);
+                       emit_textures(ctx, ring, SB_VERT_TEX, &ctx->tex[PIPE_SHADER_VERTEX]);
                else
                        dirty &= ~FD_DIRTY_VERTTEX;
        }
 
        if (dirty & FD_DIRTY_FRAGTEX) {
                if (fp->has_samp)
-                       emit_textures(ctx, ring, SB_FRAG_TEX, &ctx->fragtex);
+                       emit_textures(ctx, ring, SB_FRAG_TEX, &ctx->tex[PIPE_SHADER_FRAGMENT]);
                else
                        dirty &= ~FD_DIRTY_FRAGTEX;
        }
index 733e4a8c1714cde6c42d73d072cae6c7c19f089b..adda4a0460bb4335a6a930323fbd09d05d398892 100644 (file)
@@ -742,14 +742,14 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
 
        if (dirty & FD_DIRTY_VERTTEX) {
                if (vp->has_samp)
-                       emit_textures(ctx, ring, SB4_VS_TEX, &ctx->verttex, vp);
+                       emit_textures(ctx, ring, SB4_VS_TEX, &ctx->tex[PIPE_SHADER_VERTEX], vp);
                else
                        dirty &= ~FD_DIRTY_VERTTEX;
        }
 
        if (dirty & FD_DIRTY_FRAGTEX) {
                if (fp->has_samp)
-                       emit_textures(ctx, ring, SB4_FS_TEX, &ctx->fragtex, fp);
+                       emit_textures(ctx, ring, SB4_FS_TEX, &ctx->tex[PIPE_SHADER_FRAGMENT], fp);
                else
                        dirty &= ~FD_DIRTY_FRAGTEX;
        }
index e9dbab93b1a38865bcf5f136f4333f1a0f5dd79f..b3307422ea330a60e6fd2ee4c7e131fe1e1ef108 100644 (file)
@@ -260,8 +260,9 @@ emit_border_color(struct fd_context *ctx, struct fd_ringbuffer *ring)
 
        entries = ptr;
 
-       setup_border_colors(&ctx->verttex, &entries[0]);
-       setup_border_colors(&ctx->fragtex, &entries[ctx->verttex.num_samplers]);
+       setup_border_colors(&ctx->tex[PIPE_SHADER_VERTEX], &entries[0]);
+       setup_border_colors(&ctx->tex[PIPE_SHADER_FRAGMENT],
+                       &entries[ctx->tex[PIPE_SHADER_VERTEX].num_samplers]);
 
        OUT_PKT4(ring, REG_A5XX_TPL1_TP_BORDER_COLOR_BASE_ADDR_LO, 2);
        OUT_RELOC(ring, fd_resource(fd5_ctx->border_color_buf)->bo, off, 0, 0);
@@ -274,7 +275,7 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
                enum a4xx_state_block sb, struct fd_texture_stateobj *tex)
 {
        bool needs_border = false;
-       unsigned bcolor_offset = (sb == SB4_FS_TEX) ? ctx->verttex.num_samplers : 0;
+       unsigned bcolor_offset = (sb == SB4_FS_TEX) ? ctx->tex[PIPE_SHADER_VERTEX].num_samplers : 0;
        unsigned i;
 
        if (tex->num_samplers > 0) {
@@ -648,9 +649,10 @@ fd5_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
 
        if (dirty & FD_DIRTY_VERTTEX) {
                if (vp->has_samp) {
-                       needs_border |= emit_textures(ctx, ring, SB4_VS_TEX, &ctx->verttex);
+                       needs_border |= emit_textures(ctx, ring, SB4_VS_TEX,
+                                       &ctx->tex[PIPE_SHADER_VERTEX]);
                        OUT_PKT4(ring, REG_A5XX_TPL1_VS_TEX_COUNT, 1);
-                       OUT_RING(ring, ctx->verttex.num_textures);
+                       OUT_RING(ring, ctx->tex[PIPE_SHADER_VERTEX].num_textures);
                } else {
                        dirty &= ~FD_DIRTY_VERTTEX;
                }
@@ -658,9 +660,10 @@ fd5_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
 
        if (dirty & FD_DIRTY_FRAGTEX) {
                if (fp->has_samp) {
-                       needs_border |= emit_textures(ctx, ring, SB4_FS_TEX, &ctx->fragtex);
+                       needs_border |= emit_textures(ctx, ring, SB4_FS_TEX,
+                                       &ctx->tex[PIPE_SHADER_FRAGMENT]);
                        OUT_PKT4(ring, REG_A5XX_TPL1_FS_TEX_COUNT, 1);
-                       OUT_RING(ring, ctx->fragtex.num_textures);
+                       OUT_RING(ring, ctx->tex[PIPE_SHADER_FRAGMENT].num_textures);
                } else {
                        dirty &= ~FD_DIRTY_FRAGTEX;
                }
index cb33b8c0dfcb12534de1ac46ccfa4c8c1766b133..67291a097cc90c4f7a0b564a5976b1f1695f6bcd 100644 (file)
@@ -229,7 +229,7 @@ struct fd_context {
        struct pipe_rasterizer_state *rasterizer;
        struct pipe_depth_stencil_alpha_state *zsa;
 
-       struct fd_texture_stateobj verttex, fragtex;
+       struct fd_texture_stateobj tex[PIPE_SHADER_TYPES];
 
        struct fd_program_stateobj prog;
 
index a3c35cbce9633f0162693f0e3d5dccdf925e2c12..22d20c489c55e04c0eebad6e146fe7f34c2c48e1 100644 (file)
@@ -160,10 +160,10 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
        resource_read(batch, ctx->indexbuf.buffer);
 
        /* Mark textures as being read */
-       foreach_bit(i, ctx->verttex.valid_textures)
-               resource_read(batch, ctx->verttex.textures[i]->texture);
-       foreach_bit(i, ctx->fragtex.valid_textures)
-               resource_read(batch, ctx->fragtex.textures[i]->texture);
+       foreach_bit(i, ctx->tex[PIPE_SHADER_VERTEX].valid_textures)
+               resource_read(batch, ctx->tex[PIPE_SHADER_VERTEX].textures[i]->texture);
+       foreach_bit(i, ctx->tex[PIPE_SHADER_FRAGMENT].valid_textures)
+               resource_read(batch, ctx->tex[PIPE_SHADER_FRAGMENT].textures[i]->texture);
 
        /* Mark streamout buffers as being written.. */
        for (i = 0; i < ctx->streamout.num_targets; i++)
index a24f3f3090381b1fb1c6bc2dfa186c49237ae37e..427ada8b667cbf4ea55d9d80b2245c9520a7a58b 100644 (file)
@@ -77,12 +77,12 @@ fd_invalidate_resource(struct fd_context *ctx, struct pipe_resource *prsc)
                ctx->dirty |= FD_DIRTY_INDEXBUF;
 
        /* Textures */
-       for (i = 0; i < ctx->verttex.num_textures && !(ctx->dirty & FD_DIRTY_VERTTEX); i++) {
-               if (ctx->verttex.textures[i] && (ctx->verttex.textures[i]->texture == prsc))
+       for (i = 0; i < ctx->tex[PIPE_SHADER_VERTEX].num_textures && !(ctx->dirty & FD_DIRTY_VERTTEX); i++) {
+               if (ctx->tex[PIPE_SHADER_VERTEX].textures[i] && (ctx->tex[PIPE_SHADER_VERTEX].textures[i]->texture == prsc))
                        ctx->dirty |= FD_DIRTY_VERTTEX;
        }
-       for (i = 0; i < ctx->fragtex.num_textures && !(ctx->dirty & FD_DIRTY_FRAGTEX); i++) {
-               if (ctx->fragtex.textures[i] && (ctx->fragtex.textures[i]->texture == prsc))
+       for (i = 0; i < ctx->tex[PIPE_SHADER_FRAGMENT].num_textures && !(ctx->dirty & FD_DIRTY_FRAGTEX); i++) {
+               if (ctx->tex[PIPE_SHADER_FRAGMENT].textures[i] && (ctx->tex[PIPE_SHADER_FRAGMENT].textures[i]->texture == prsc))
                        ctx->dirty |= FD_DIRTY_FRAGTEX;
        }
 }
@@ -1079,10 +1079,11 @@ fd_blitter_pipe_begin(struct fd_context *ctx, bool render_cond, bool discard,
        util_blitter_save_framebuffer(ctx->blitter,
                        ctx->batch ? &ctx->batch->framebuffer : NULL);
        util_blitter_save_fragment_sampler_states(ctx->blitter,
-                       ctx->fragtex.num_samplers,
-                       (void **)ctx->fragtex.samplers);
+                       ctx->tex[PIPE_SHADER_FRAGMENT].num_samplers,
+                       (void **)ctx->tex[PIPE_SHADER_FRAGMENT].samplers);
        util_blitter_save_fragment_sampler_views(ctx->blitter,
-                       ctx->fragtex.num_textures, ctx->fragtex.textures);
+                       ctx->tex[PIPE_SHADER_FRAGMENT].num_textures,
+                       ctx->tex[PIPE_SHADER_FRAGMENT].textures);
        if (!render_cond)
                util_blitter_save_render_condition(ctx->blitter,
                        ctx->cond_query, ctx->cond_cond, ctx->cond_mode);
index 2d038927a5a6a676d27eaf28ffb9c44d30365ce1..d27f47eb29f875259f3ef333142ab07815152fc8 100644 (file)
@@ -91,12 +91,12 @@ fd_sampler_states_bind(struct pipe_context *pctx,
 {
        struct fd_context *ctx = fd_context(pctx);
 
+       bind_sampler_states(&ctx->tex[shader], start, nr, hwcso);
+
        if (shader == PIPE_SHADER_FRAGMENT) {
-               bind_sampler_states(&ctx->fragtex, start, nr, hwcso);
                ctx->dirty |= FD_DIRTY_FRAGTEX;
        }
        else if (shader == PIPE_SHADER_VERTEX) {
-               bind_sampler_states(&ctx->verttex, start, nr, hwcso);
                ctx->dirty |= FD_DIRTY_VERTTEX;
        }
 }
@@ -108,6 +108,8 @@ fd_set_sampler_views(struct pipe_context *pctx, enum pipe_shader_type shader,
 {
        struct fd_context *ctx = fd_context(pctx);
 
+       set_sampler_views(&ctx->tex[shader], start, nr, views);
+
        switch (shader) {
        case PIPE_SHADER_FRAGMENT:
                /* on a2xx, since there is a flat address space for textures/samplers,
@@ -116,14 +118,12 @@ fd_set_sampler_views(struct pipe_context *pctx, enum pipe_shader_type shader,
                 *
                 * (note: later gen's ignore FD_DIRTY_TEXSTATE so fine to set it)
                 */
-               if (nr != ctx->fragtex.num_textures)
+               if (nr != ctx->tex[PIPE_SHADER_FRAGMENT].num_textures)
                        ctx->dirty |= FD_DIRTY_TEXSTATE;
 
-               set_sampler_views(&ctx->fragtex, start, nr, views);
                ctx->dirty |= FD_DIRTY_FRAGTEX;
                break;
        case PIPE_SHADER_VERTEX:
-               set_sampler_views(&ctx->verttex, start, nr, views);
                ctx->dirty |= FD_DIRTY_VERTTEX;
                break;
        default: