freedreno/a4xx: wire up integer texture sampling
authorRob Clark <robclark@freedesktop.org>
Wed, 22 Apr 2015 17:05:53 +0000 (13:05 -0400)
committerRob Clark <robclark@freedesktop.org>
Wed, 22 Apr 2015 17:20:28 +0000 (13:20 -0400)
Similar to a3xx, the compiler needs to know the return type of the sam,
etc, instructions.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a4xx/fd4_context.h
src/gallium/drivers/freedreno/a4xx/fd4_draw.c
src/gallium/drivers/freedreno/a4xx/fd4_texture.c

index 87e69fa613acb0276437beb4fbb4169fe2ba8725..384602a2e4f34330efc386826ee7724056384305 100644 (file)
@@ -76,12 +76,15 @@ struct fd4_context {
        /* bitmask of sampler which needs coords clamped for vertex
         * shader:
         */
-       unsigned vsaturate_s, vsaturate_t, vsaturate_r;
+       uint16_t vsaturate_s, vsaturate_t, vsaturate_r;
 
        /* bitmask of sampler which needs coords clamped for frag
         * shader:
         */
-       unsigned fsaturate_s, fsaturate_t, fsaturate_r;
+       uint16_t fsaturate_s, fsaturate_t, fsaturate_r;
+
+       /* bitmask of integer texture samplers */
+       uint16_t vinteger_s, finteger_s;
 
        /* some state changes require a different shader variant.  Keep
         * track of this so we know when we need to re-emit shader state
index 6c54f61cc6625d0a7a0290e93637153e75f67561..ae407f753fe7c2173ce10e5abcd50d905cfa45a4 100644 (file)
@@ -82,7 +82,8 @@ fixup_shader_state(struct fd_context *ctx, struct ir3_shader_key *key)
                if (last_key->has_per_samp || key->has_per_samp) {
                        if ((last_key->vsaturate_s != key->vsaturate_s) ||
                                        (last_key->vsaturate_t != key->vsaturate_t) ||
-                                       (last_key->vsaturate_r != key->vsaturate_r))
+                                       (last_key->vsaturate_r != key->vsaturate_r) ||
+                                       (last_key->vinteger_s != key->vinteger_s))
                                ctx->prog.dirty |= FD_SHADER_DIRTY_VP;
 
                        if ((last_key->fsaturate_s != key->fsaturate_s) ||
@@ -121,13 +122,16 @@ fd4_draw_vbo(struct fd_context *ctx, const struct pipe_draw_info *info)
                        // TODO set .half_precision based on render target format,
                        // ie. float16 and smaller use half, float32 use full..
                        .half_precision = !!(fd_mesa_debug & FD_DBG_FRAGHALF),
-                       .has_per_samp = fd4_ctx->fsaturate || fd4_ctx->vsaturate,
+                       .has_per_samp = (fd4_ctx->fsaturate || fd4_ctx->vsaturate ||
+                                       fd4_ctx->vinteger_s || fd4_ctx->finteger_s),
                        .vsaturate_s = fd4_ctx->vsaturate_s,
                        .vsaturate_t = fd4_ctx->vsaturate_t,
                        .vsaturate_r = fd4_ctx->vsaturate_r,
                        .fsaturate_s = fd4_ctx->fsaturate_s,
                        .fsaturate_t = fd4_ctx->fsaturate_t,
                        .fsaturate_r = fd4_ctx->fsaturate_r,
+                       .vinteger_s = fd4_ctx->vinteger_s,
+                       .finteger_s = fd4_ctx->finteger_s,
                },
                .format = fd4_emit_format(pfb->cbufs[0]),
                .pformat = pipe_surface_format(pfb->cbufs[0]),
index 6ba25d0816d3afcdbff4626e8bd641c879d9a81e..ff1ff8f0d3433f0fd5a8aa615ed2ec7112fdf204 100644 (file)
@@ -205,11 +205,43 @@ fd4_sampler_view_create(struct pipe_context *pctx, struct pipe_resource *prsc,
        return &so->base;
 }
 
+static void
+fd4_set_sampler_views(struct pipe_context *pctx, unsigned shader,
+               unsigned start, unsigned nr, struct pipe_sampler_view **views)
+{
+       struct fd_context *ctx = fd_context(pctx);
+       struct fd4_context *fd4_ctx = fd4_context(ctx);
+       struct fd_texture_stateobj *tex;
+       uint16_t integer_s = 0, *ptr;
+       int i;
+
+       fd_set_sampler_views(pctx, shader, start, nr, views);
+
+       switch (shader) {
+       case PIPE_SHADER_FRAGMENT:
+               tex = &ctx->fragtex;
+               ptr = &fd4_ctx->finteger_s;
+               break;
+       case PIPE_SHADER_VERTEX:
+               tex = &ctx->verttex;
+               ptr = &fd4_ctx->vinteger_s;
+               break;
+       default:
+               return;
+       }
+
+       for (i = 0; i < tex->num_textures; i++)
+               if (util_format_is_pure_integer(tex->textures[i]->format))
+                       integer_s |= 1 << i;
+
+       *ptr = integer_s;
+}
+
 void
 fd4_texture_init(struct pipe_context *pctx)
 {
        pctx->create_sampler_state = fd4_sampler_state_create;
        pctx->bind_sampler_states = fd_sampler_states_bind;
        pctx->create_sampler_view = fd4_sampler_view_create;
-       pctx->set_sampler_views = fd_set_sampler_views;
+       pctx->set_sampler_views = fd4_set_sampler_views;
 }