radeonsi/gfx10: add si_context::emit_cache_flush
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.c
index eb75e2a77a41da7a6b2f046000cc3368779aaa0f..934639822d0b011d21c5ea447a0066c2b17240ed 100644 (file)
@@ -47,14 +47,6 @@ static const char scratch_rsrc_dword0_symbol[] =
 static const char scratch_rsrc_dword1_symbol[] =
        "SCRATCH_RSRC_DWORD1";
 
-struct si_shader_output_values
-{
-       LLVMValueRef values[4];
-       unsigned semantic_name;
-       unsigned semantic_index;
-       ubyte vertex_stream[4];
-};
-
 static void si_init_shader_ctx(struct si_shader_context *ctx,
                               struct si_screen *sscreen,
                               struct ac_llvm_compiler *compiler);
@@ -647,8 +639,8 @@ static void declare_input_vs(
        si_llvm_load_input_vs(ctx, input_index, out);
 }
 
-static LLVMValueRef get_primitive_id(struct si_shader_context *ctx,
-                                    unsigned swizzle)
+LLVMValueRef si_get_primitive_id(struct si_shader_context *ctx,
+                                unsigned swizzle)
 {
        if (swizzle > 0)
                return ctx->i32_0;
@@ -1633,7 +1625,7 @@ static LLVMValueRef fetch_input_gs(
 
        unsigned semantic_name = info->input_semantic_name[reg->Register.Index];
        if (swizzle != ~0 && semantic_name == TGSI_SEMANTIC_PRIMID)
-               return get_primitive_id(ctx, swizzle);
+               return si_get_primitive_id(ctx, swizzle);
 
        if (!reg->Register.Dimension)
                return NULL;
@@ -2119,7 +2111,7 @@ void si_load_system_value(struct si_shader_context *ctx,
        }
 
        case TGSI_SEMANTIC_PRIMID:
-               value = get_primitive_id(ctx, 0);
+               value = si_get_primitive_id(ctx, 0);
                break;
 
        case TGSI_SEMANTIC_GRID_SIZE:
@@ -2614,11 +2606,11 @@ static void si_dump_streamout(struct pipe_stream_output_info *so)
        }
 }
 
-static void emit_streamout_output(struct si_shader_context *ctx,
-                                 LLVMValueRef const *so_buffers,
-                                 LLVMValueRef const *so_write_offsets,
-                                 struct pipe_stream_output *stream_out,
-                                 struct si_shader_output_values *shader_out)
+void si_emit_streamout_output(struct si_shader_context *ctx,
+                             LLVMValueRef const *so_buffers,
+                             LLVMValueRef const *so_write_offsets,
+                             struct pipe_stream_output *stream_out,
+                             struct si_shader_output_values *shader_out)
 {
        unsigned buf_idx = stream_out->output_buffer;
        unsigned start = stream_out->start_component;
@@ -2741,8 +2733,8 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
                        if (stream != so->output[i].stream)
                                continue;
 
-                       emit_streamout_output(ctx, so_buffers, so_write_offset,
-                                             &so->output[i], &outputs[reg]);
+                       si_emit_streamout_output(ctx, so_buffers, so_write_offset,
+                                                &so->output[i], &outputs[reg]);
                }
        }
        lp_build_endif(&if_ctx);
@@ -2870,10 +2862,12 @@ static void si_vertex_color_clamping(struct si_shader_context *ctx,
        }
 }
 
-/* Generate export instructions for hardware VS shader stage */
-static void si_llvm_export_vs(struct si_shader_context *ctx,
-                             struct si_shader_output_values *outputs,
-                             unsigned noutput)
+/* Generate export instructions for hardware VS shader stage or NGG GS stage
+ * (position and parameter data only).
+ */
+void si_llvm_export_vs(struct si_shader_context *ctx,
+                      struct si_shader_output_values *outputs,
+                      unsigned noutput)
 {
        struct si_shader *shader = ctx->shader;
        struct ac_export_args pos_args[4] = {};
@@ -3614,7 +3608,7 @@ static void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi,
        if (ctx->shader->key.mono.u.vs_export_prim_id) {
                outputs[i].semantic_name = TGSI_SEMANTIC_PRIMID;
                outputs[i].semantic_index = 0;
-               outputs[i].values[0] = ac_to_float(&ctx->ac, get_primitive_id(ctx, 0));
+               outputs[i].values[0] = ac_to_float(&ctx->ac, si_get_primitive_id(ctx, 0));
                for (j = 1; j < 4; j++)
                        outputs[i].values[j] = LLVMConstReal(ctx->f32, 0);
 
@@ -6135,7 +6129,8 @@ static void si_get_ps_prolog_key(struct si_shader *shader,
                        /* BCOLORs are stored after the last input. */
                        key->ps_prolog.num_interp_inputs = info->num_inputs;
                        key->ps_prolog.face_vgpr_index = shader->info.face_vgpr_index;
-                       shader->config.spi_ps_input_ena |= S_0286CC_FRONT_FACE_ENA(1);
+                       if (separate_prolog)
+                               shader->config.spi_ps_input_ena |= S_0286CC_FRONT_FACE_ENA(1);
                }
 
                for (unsigned i = 0; i < 2; i++) {
@@ -6166,18 +6161,24 @@ static void si_get_ps_prolog_key(struct si_shader *shader,
                                switch (location) {
                                case TGSI_INTERPOLATE_LOC_SAMPLE:
                                        key->ps_prolog.color_interp_vgpr_index[i] = 0;
-                                       shader->config.spi_ps_input_ena |=
-                                               S_0286CC_PERSP_SAMPLE_ENA(1);
+                                       if (separate_prolog) {
+                                               shader->config.spi_ps_input_ena |=
+                                                       S_0286CC_PERSP_SAMPLE_ENA(1);
+                                       }
                                        break;
                                case TGSI_INTERPOLATE_LOC_CENTER:
                                        key->ps_prolog.color_interp_vgpr_index[i] = 2;
-                                       shader->config.spi_ps_input_ena |=
-                                               S_0286CC_PERSP_CENTER_ENA(1);
+                                       if (separate_prolog) {
+                                               shader->config.spi_ps_input_ena |=
+                                                       S_0286CC_PERSP_CENTER_ENA(1);
+                                       }
                                        break;
                                case TGSI_INTERPOLATE_LOC_CENTROID:
                                        key->ps_prolog.color_interp_vgpr_index[i] = 4;
-                                       shader->config.spi_ps_input_ena |=
-                                               S_0286CC_PERSP_CENTROID_ENA(1);
+                                       if (separate_prolog) {
+                                               shader->config.spi_ps_input_ena |=
+                                                       S_0286CC_PERSP_CENTROID_ENA(1);
+                                       }
                                        break;
                                default:
                                        assert(0);
@@ -6198,20 +6199,26 @@ static void si_get_ps_prolog_key(struct si_shader *shader,
                                case TGSI_INTERPOLATE_LOC_SAMPLE:
                                        key->ps_prolog.color_interp_vgpr_index[i] =
                                                separate_prolog ? 6 : 9;
-                                       shader->config.spi_ps_input_ena |=
-                                               S_0286CC_LINEAR_SAMPLE_ENA(1);
+                                       if (separate_prolog) {
+                                               shader->config.spi_ps_input_ena |=
+                                                       S_0286CC_LINEAR_SAMPLE_ENA(1);
+                                       }
                                        break;
                                case TGSI_INTERPOLATE_LOC_CENTER:
                                        key->ps_prolog.color_interp_vgpr_index[i] =
                                                separate_prolog ? 8 : 11;
-                                       shader->config.spi_ps_input_ena |=
-                                               S_0286CC_LINEAR_CENTER_ENA(1);
+                                       if (separate_prolog) {
+                                               shader->config.spi_ps_input_ena |=
+                                                       S_0286CC_LINEAR_CENTER_ENA(1);
+                                       }
                                        break;
                                case TGSI_INTERPOLATE_LOC_CENTROID:
                                        key->ps_prolog.color_interp_vgpr_index[i] =
                                                separate_prolog ? 10 : 13;
-                                       shader->config.spi_ps_input_ena |=
-                                               S_0286CC_LINEAR_CENTROID_ENA(1);
+                                       if (separate_prolog) {
+                                               shader->config.spi_ps_input_ena |=
+                                                       S_0286CC_LINEAR_CENTROID_ENA(1);
+                                       }
                                        break;
                                default:
                                        assert(0);
@@ -6591,7 +6598,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
                        out_idx += param_size;
                }
 
-               ret = LLVMBuildCall(builder, parts[part], in, num_params, "");
+               ret = ac_build_call(&ctx->ac, parts[part], in, num_params);
 
                if (is_merged_shader(ctx) &&
                    part + 1 == next_shader_first_part) {