[Mesa-dev] [PATCH 07/31] radeonsi: move main TGSI translation into its own function
Nicolai Hähnle
nhaehnle at gmail.com
Mon Oct 31 22:10:54 UTC 2016
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
The idea is that adding prolog and epilog code will be pulled out into the
caller.
---
src/gallium/drivers/radeonsi/si_shader.c | 103 +++++++++++++++++--------------
1 file changed, 58 insertions(+), 45 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 8871742..6ae63c8 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -6667,54 +6667,29 @@ static void si_eliminate_const_vs_outputs(struct si_shader_context *ctx)
V_008DFC_SQ_EXP_PARAM + new_count, 0));
shader->info.vs_output_param_offset[out] = new_count;
new_count++;
break;
}
}
shader->info.nr_param_exports = new_count;
}
}
-int si_compile_tgsi_shader(struct si_screen *sscreen,
- LLVMTargetMachineRef tm,
- struct si_shader *shader,
- bool is_monolithic,
- struct pipe_debug_callback *debug)
+static bool si_compile_tgsi_main(struct si_shader_context *ctx,
+ struct si_shader *shader)
{
struct si_shader_selector *sel = shader->selector;
- struct si_shader_context ctx;
- struct lp_build_tgsi_context *bld_base;
- LLVMModuleRef mod;
- int r = 0;
-
- /* Dump TGSI code before doing TGSI->LLVM conversion in case the
- * conversion fails. */
- if (r600_can_dump_shader(&sscreen->b, sel->info.processor) &&
- !(sscreen->b.debug_flags & DBG_NO_TGSI)) {
- tgsi_dump(sel->tokens, 0);
- si_dump_streamout(&sel->so);
- }
-
- si_init_shader_ctx(&ctx, sscreen, shader, tm);
- ctx.is_monolithic = is_monolithic;
-
- memset(shader->info.vs_output_param_offset, 0xff,
- sizeof(shader->info.vs_output_param_offset));
-
- shader->info.uses_instanceid = sel->info.uses_instanceid;
-
- bld_base = &ctx.soa.bld_base;
- ctx.load_system_value = declare_system_value;
+ struct lp_build_tgsi_context *bld_base = &ctx->soa.bld_base;
- switch (ctx.type) {
+ switch (ctx->type) {
case PIPE_SHADER_VERTEX:
- ctx.load_input = declare_input_vs;
+ ctx->load_input = declare_input_vs;
if (shader->key.vs.as_ls)
bld_base->emit_epilogue = si_llvm_emit_ls_epilogue;
else if (shader->key.vs.as_es)
bld_base->emit_epilogue = si_llvm_emit_es_epilogue;
else
bld_base->emit_epilogue = si_llvm_emit_vs_epilogue;
break;
case PIPE_SHADER_TESS_CTRL:
bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_tcs;
bld_base->emit_fetch_funcs[TGSI_FILE_OUTPUT] = fetch_output_tcs;
@@ -6726,61 +6701,98 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
if (shader->key.tes.as_es)
bld_base->emit_epilogue = si_llvm_emit_es_epilogue;
else
bld_base->emit_epilogue = si_llvm_emit_vs_epilogue;
break;
case PIPE_SHADER_GEOMETRY:
bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_gs;
bld_base->emit_epilogue = si_llvm_emit_gs_epilogue;
break;
case PIPE_SHADER_FRAGMENT:
- ctx.load_input = declare_input_fs;
- if (is_monolithic)
+ ctx->load_input = declare_input_fs;
+ if (ctx->is_monolithic)
bld_base->emit_epilogue = si_llvm_emit_fs_epilogue;
else
bld_base->emit_epilogue = si_llvm_return_fs_outputs;
break;
case PIPE_SHADER_COMPUTE:
- ctx.declare_memory_region = declare_compute_memory;
+ ctx->declare_memory_region = declare_compute_memory;
break;
default:
assert(!"Unsupported shader type");
- return -1;
+ return false;
}
- create_meta_data(&ctx);
- create_function(&ctx);
- preload_ring_buffers(&ctx);
+ create_meta_data(ctx);
+ create_function(ctx);
+ preload_ring_buffers(ctx);
- if (ctx.is_monolithic && sel->type == PIPE_SHADER_FRAGMENT &&
+ if (ctx->is_monolithic && sel->type == PIPE_SHADER_FRAGMENT &&
shader->key.ps.prolog.poly_stipple) {
- LLVMValueRef list = LLVMGetParam(ctx.main_fn,
+ LLVMValueRef list = LLVMGetParam(ctx->main_fn,
SI_PARAM_RW_BUFFERS);
- si_llvm_emit_polygon_stipple(&ctx, list,
+ si_llvm_emit_polygon_stipple(ctx, list,
SI_PARAM_POS_FIXED_PT);
}
- if (ctx.type == PIPE_SHADER_GEOMETRY) {
+ if (ctx->type == PIPE_SHADER_GEOMETRY) {
int i;
for (i = 0; i < 4; i++) {
- ctx.gs_next_vertex[i] =
+ ctx->gs_next_vertex[i] =
lp_build_alloca(bld_base->base.gallivm,
- ctx.i32, "");
+ ctx->i32, "");
}
}
if (!lp_build_tgsi_llvm(bld_base, sel->tokens)) {
fprintf(stderr, "Failed to translate shader from TGSI to LLVM\n");
- goto out;
+ return false;
}
- si_llvm_build_ret(&ctx, ctx.return_value);
+ si_llvm_build_ret(ctx, ctx->return_value);
+ return true;
+}
+
+int si_compile_tgsi_shader(struct si_screen *sscreen,
+ LLVMTargetMachineRef tm,
+ struct si_shader *shader,
+ bool is_monolithic,
+ struct pipe_debug_callback *debug)
+{
+ struct si_shader_selector *sel = shader->selector;
+ struct si_shader_context ctx;
+ struct lp_build_tgsi_context *bld_base;
+ LLVMModuleRef mod;
+ int r = -1;
+
+ /* Dump TGSI code before doing TGSI->LLVM conversion in case the
+ * conversion fails. */
+ if (r600_can_dump_shader(&sscreen->b, sel->info.processor) &&
+ !(sscreen->b.debug_flags & DBG_NO_TGSI)) {
+ tgsi_dump(sel->tokens, 0);
+ si_dump_streamout(&sel->so);
+ }
+
+ si_init_shader_ctx(&ctx, sscreen, shader, tm);
+ ctx.is_monolithic = is_monolithic;
+
+ memset(shader->info.vs_output_param_offset, 0xff,
+ sizeof(shader->info.vs_output_param_offset));
+
+ shader->info.uses_instanceid = sel->info.uses_instanceid;
+
+ bld_base = &ctx.soa.bld_base;
+ ctx.load_system_value = declare_system_value;
+
+ if (!si_compile_tgsi_main(&ctx, shader))
+ goto out;
+
mod = bld_base->base.gallivm->module;
/* Dump LLVM IR before any optimization passes */
if (sscreen->b.debug_flags & DBG_PREOPT_IR &&
r600_can_dump_shader(&sscreen->b, ctx.type))
LLVMDumpModule(mod);
si_llvm_finalize_module(&ctx,
r600_extra_shader_checks(&sscreen->b, ctx.type));
@@ -6887,20 +6899,21 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
shader->gs_copy_shader->selector = shader->selector;
ctx.shader = shader->gs_copy_shader;
if ((r = si_generate_gs_copy_shader(sscreen, &ctx,
shader, debug))) {
free(shader->gs_copy_shader);
shader->gs_copy_shader = NULL;
goto out;
}
}
+ r = 0;
out:
return r;
}
/**
* Create, compile and return a shader part (prolog or epilog).
*
* \param sscreen screen
* \param list list of shader parts of the same category
* \param key shader part key
--
2.7.4
More information about the mesa-dev
mailing list