freedreno/ir3: pass ctx to constant-emit code
authorRob Clark <robclark@freedesktop.org>
Tue, 1 Mar 2016 22:41:52 +0000 (17:41 -0500)
committerRob Clark <robclark@freedesktop.org>
Wed, 2 Mar 2016 00:20:44 +0000 (19:20 -0500)
Rather than fishing it out of the shader.  This removes the other big
user of shader->pctx.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_emit.c
src/gallium/drivers/freedreno/a4xx/fd4_emit.c
src/gallium/drivers/freedreno/ir3/ir3_shader.c
src/gallium/drivers/freedreno/ir3/ir3_shader.h

index 8c37992e17de1d1b8f2ba53c7a712864830eab04..ab4f8e1632a6ca3493116c713e68a63a2695f9c7 100644 (file)
@@ -656,9 +656,9 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
        OUT_RING(ring, HLSQ_FLUSH);
 
        if (emit->prog == &ctx->prog) { /* evil hack to deal sanely with clear path */
-               ir3_emit_consts(vp, ring, emit->info, dirty);
+               ir3_emit_consts(vp, ring, ctx, emit->info, dirty);
                if (!emit->key.binning_pass)
-                       ir3_emit_consts(fp, ring, emit->info, dirty);
+                       ir3_emit_consts(fp, ring, ctx, emit->info, dirty);
                /* mark clean after emitting consts: */
                ctx->prog.dirty = 0;
        }
index 72154bf286a1786f25a9a1c8d24f4b87cd81814a..78a7d0e3fab42421fdd9d51ad50aaeb2437db983 100644 (file)
@@ -623,9 +623,9 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring,
        }
 
        if (emit->prog == &ctx->prog) { /* evil hack to deal sanely with clear path */
-               ir3_emit_consts(vp, ring, emit->info, dirty);
+               ir3_emit_consts(vp, ring, ctx, emit->info, dirty);
                if (!emit->key.binning_pass)
-                       ir3_emit_consts(fp, ring, emit->info, dirty);
+                       ir3_emit_consts(fp, ring, ctx, emit->info, dirty);
                /* mark clean after emitting consts: */
                ctx->prog.dirty = 0;
        }
index 26106072b5ab65615ff1e4e89c5fec0891fe5452..d79e05b9fe52aac72e3e1c99b4381e88eae5d581 100644 (file)
@@ -463,10 +463,9 @@ ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin)
 #include "freedreno_resource.h"
 
 static void
-emit_user_consts(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
-               struct fd_constbuf_stateobj *constbuf)
+emit_user_consts(struct fd_context *ctx, struct ir3_shader_variant *v,
+               struct fd_ringbuffer *ring, struct fd_constbuf_stateobj *constbuf)
 {
-       struct fd_context *ctx = fd_context(v->shader->pctx);
        const unsigned index = 0;     /* user consts are index 0 */
        /* TODO save/restore dirty_mask for binning pass instead: */
        uint32_t dirty_mask = constbuf->enabled_mask;
@@ -502,12 +501,11 @@ emit_user_consts(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
 }
 
 static void
-emit_ubos(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
-               struct fd_constbuf_stateobj *constbuf)
+emit_ubos(struct fd_context *ctx, struct ir3_shader_variant *v,
+               struct fd_ringbuffer *ring, struct fd_constbuf_stateobj *constbuf)
 {
        uint32_t offset = v->first_driver_param + IR3_UBOS_OFF;
        if (v->constlen > offset) {
-               struct fd_context *ctx = fd_context(v->shader->pctx);
                uint32_t params = MIN2(4, v->constlen - offset) * 4;
                uint32_t offsets[params];
                struct fd_bo *bos[params];
@@ -532,9 +530,9 @@ emit_ubos(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
 }
 
 static void
-emit_immediates(struct ir3_shader_variant *v, struct fd_ringbuffer *ring)
+emit_immediates(struct fd_context *ctx, struct ir3_shader_variant *v,
+               struct fd_ringbuffer *ring)
 {
-       struct fd_context *ctx = fd_context(v->shader->pctx);
        int size = v->immediates_count;
        uint32_t base = v->first_immediate;
 
@@ -556,12 +554,12 @@ emit_immediates(struct ir3_shader_variant *v, struct fd_ringbuffer *ring)
 
 /* emit stream-out buffers: */
 static void
-emit_tfbos(struct ir3_shader_variant *v, struct fd_ringbuffer *ring)
+emit_tfbos(struct fd_context *ctx, struct ir3_shader_variant *v,
+               struct fd_ringbuffer *ring)
 {
        /* streamout addresses after driver-params: */
        uint32_t offset = v->first_driver_param + IR3_TFBOS_OFF;
        if (v->constlen > offset) {
-               struct fd_context *ctx = fd_context(v->shader->pctx);
                struct fd_streamout_stateobj *so = &ctx->streamout;
                struct pipe_stream_output_info *info = &v->shader->stream_output;
                uint32_t params = 4;
@@ -587,9 +585,8 @@ emit_tfbos(struct ir3_shader_variant *v, struct fd_ringbuffer *ring)
 }
 
 static uint32_t
-max_tf_vtx(struct ir3_shader_variant *v)
+max_tf_vtx(struct fd_context *ctx, struct ir3_shader_variant *v)
 {
-       struct fd_context *ctx = fd_context(v->shader->pctx);
        struct fd_streamout_stateobj *so = &ctx->streamout;
        struct pipe_stream_output_info *info = &v->shader->stream_output;
        uint32_t maxvtxcnt = 0x7fffffff;
@@ -634,10 +631,8 @@ max_tf_vtx(struct ir3_shader_variant *v)
 
 void
 ir3_emit_consts(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
-               const struct pipe_draw_info *info, uint32_t dirty)
+               struct fd_context *ctx, const struct pipe_draw_info *info, uint32_t dirty)
 {
-       struct fd_context *ctx = fd_context(v->shader->pctx);
-
        if (dirty & (FD_DIRTY_PROG | FD_DIRTY_CONSTBUF)) {
                struct fd_constbuf_stateobj *constbuf;
                bool shader_dirty;
@@ -653,10 +648,10 @@ ir3_emit_consts(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
                        return;
                }
 
-               emit_user_consts(v, ring, constbuf);
-               emit_ubos(v, ring, constbuf);
+               emit_user_consts(ctx, v, ring, constbuf);
+               emit_ubos(ctx, v, ring, constbuf);
                if (shader_dirty)
-                       emit_immediates(v, ring);
+                       emit_immediates(ctx, v, ring);
        }
 
        /* emit driver params every time: */
@@ -667,7 +662,7 @@ ir3_emit_consts(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
                        uint32_t vertex_params[IR3_DP_COUNT] = {
                                [IR3_DP_VTXID_BASE] = info->indexed ?
                                                info->index_bias : info->start,
-                               [IR3_DP_VTXCNT_MAX] = max_tf_vtx(v),
+                               [IR3_DP_VTXCNT_MAX] = max_tf_vtx(ctx, v),
                        };
                        /* if no user-clip-planes, we don't need to emit the
                         * entire thing:
@@ -692,7 +687,7 @@ ir3_emit_consts(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
 
                        /* if needed, emit stream-out buffer addresses: */
                        if (vertex_params[IR3_DP_VTXCNT_MAX] > 0) {
-                               emit_tfbos(v, ring);
+                               emit_tfbos(ctx, v, ring);
                        }
                }
        }
index 03d4fa2e9271ccb6c50ae4f012e314a3ef5f045b..f3e7c44f3c746dba3a7087eaecc201c84e9ebe04 100644 (file)
@@ -258,8 +258,9 @@ struct ir3_shader_variant * ir3_shader_variant(struct ir3_shader *shader,
 void ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin);
 
 struct fd_ringbuffer;
+struct fd_context;
 void ir3_emit_consts(struct ir3_shader_variant *v, struct fd_ringbuffer *ring,
-               const struct pipe_draw_info *info, uint32_t dirty);
+               struct fd_context *ctx, const struct pipe_draw_info *info, uint32_t dirty);
 
 static inline const char *
 ir3_shader_stage(struct ir3_shader *shader)