radeonsi: Take GS into account for VS state in more places
authorMichel Dänzer <michel.daenzer@amd.com>
Thu, 9 Jan 2014 07:10:49 +0000 (16:10 +0900)
committerMichel Dänzer <michel@daenzer.net>
Wed, 29 Jan 2014 02:07:35 +0000 (11:07 +0900)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader.h
src/gallium/drivers/radeonsi/si_state_draw.c

index 6788255f62b9850b0aa3f6569c4afefd8d1b7eff..227d682992654ffdceae7efa782073d41fc18f17 100644 (file)
@@ -2330,6 +2330,7 @@ static int si_generate_gs_copy_shader(struct si_context *sctx,
        struct lp_build_tgsi_context *bld_base = &si_shader_ctx->radeon_bld.soa.bld_base;
        struct lp_build_context *base = &bld_base->base;
        struct lp_build_context *uint = &bld_base->uint_bld;
+       struct si_shader *shader = &si_shader_ctx->shader->shader;
        struct si_shader *gs = &si_shader_ctx->shader->selector->current->shader;
        struct si_shader_output_values *outputs;
        LLVMValueRef t_list_ptr, t_list;
@@ -2370,6 +2371,8 @@ static int si_generate_gs_copy_shader(struct si_context *sctx,
                struct si_shader_output *out = gs->output + i;
                unsigned chan;
 
+               shader->output[i] = *out;
+
                outputs[i].name = out->name;
                outputs[i].index = out->index;
                outputs[i].usage = out->usage;
@@ -2389,6 +2392,7 @@ static int si_generate_gs_copy_shader(struct si_context *sctx,
                                                 base->elem_type, "");
                }
        }
+       shader->noutput = gs->noutput;
 
        si_llvm_export_vs(bld_base, outputs, gs->noutput);
 
index d11d34646ac0c79c0bc259b5e3edfca1ed1782c0..63c19ecaeef5ba02394adeeefbb8171f0cbd09d4 100644 (file)
@@ -183,6 +183,14 @@ struct si_pipe_shader {
        union si_shader_key             key;
 };
 
+static inline struct si_shader* si_get_vs_state(struct si_context *sctx)
+{
+       if (sctx->gs_shader)
+               return &sctx->gs_shader->current->gs_copy_shader->shader;
+       else
+               return &sctx->vs_shader->current->shader;
+}
+
 /* radeonsi_shader.c */
 int si_pipe_shader_create(struct pipe_context *ctx, struct si_pipe_shader *shader);
 int si_pipe_shader_create(struct pipe_context *ctx, struct si_pipe_shader *shader);
index 41d2e1c24ac31cca1cc6ad7b47b30c1430a51554..e4045cd85a6b43d5d828075466f2ae6ea3f569b4 100644 (file)
@@ -403,7 +403,7 @@ static bool si_update_draw_info_state(struct si_context *sctx,
                                      const struct pipe_index_buffer *ib)
 {
        struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx);
-       struct si_shader *vs = &sctx->vs_shader->current->shader;
+       struct si_shader *vs = si_get_vs_state(sctx);
        unsigned prim = si_conv_pipe_prim(info->mode);
        unsigned gs_out_prim =
                si_conv_prim_to_gs_out(sctx->gs_shader ?
@@ -488,7 +488,7 @@ static bool si_update_draw_info_state(struct si_context *sctx,
 static void si_update_spi_map(struct si_context *sctx)
 {
        struct si_shader *ps = &sctx->ps_shader->current->shader;
-       struct si_shader *vs = &sctx->vs_shader->current->shader;
+       struct si_shader *vs = si_get_vs_state(sctx);
        struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx);
        unsigned i, j, tmp;