diff options
author | Vincent Lejeune <vljn@ovi.com> | 2012-07-14 18:49:35 +0200 |
---|---|---|
committer | Vincent Lejeune <vljn@ovi.com> | 2012-12-05 19:14:42 +0100 |
commit | 378c8c7df16f3aff0727eb3d407c9f18a487928a (patch) | |
tree | b8bad16707126ac40bb473de102ea9bfeaf3fcad | |
parent | de99a70f6cbe8423191dc259fe9582673148bf5b (diff) |
gallium/radeon: enable glsl-to-llvmglsl-to-llvm-05nov
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 48 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_state_common.c | 9 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/radeon_llvm_emit.cpp | 1 | ||||
-rw-r--r-- | src/gallium/include/pipe/p_state.h | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 27 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.h | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_program.c | 13 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_program.h | 3 |
11 files changed, 102 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index 3c2a923181..fb065a15ab 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -1658,6 +1658,8 @@ void *ureg_create_shader( struct ureg_program *ureg, else memset(&state.stream_output, 0, sizeof(state.stream_output)); + state.llvm_module = NULL; + if (ureg->processor == TGSI_PROCESSOR_VERTEX) return pipe->create_vs_state( pipe, &state ); else diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index 219bd54304..140ca5fe37 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -279,6 +279,7 @@ struct r600_dsa_state { struct r600_pipe_shader; struct r600_pipe_shader_selector { + struct LLVMOpaqueModule * modinfo; struct r600_pipe_shader *current; struct tgsi_token *tokens; diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 72cb58582f..6e68b5e5e8 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -26,6 +26,7 @@ #include "r600_opcodes.h" #include "r600_shader.h" #include "r600d.h" +#include "R600ReserveReg.h" #include "pipe/p_shader_tokens.h" #include "tgsi/tgsi_info.h" @@ -141,6 +142,7 @@ int r600_pipe_shader_create(struct pipe_context *ctx, } } } + shader->modinfo = sel->modinfo; r = r600_shader_from_tgsi(rctx->screen, shader, key); if (r) { R600_ERR("translation from TGSI failed !\n"); @@ -344,6 +346,8 @@ static unsigned r600_alu_from_byte_stream(struct r600_shader_ctx *ctx, alu.last = 1; } #endif + + ctx->bc->ar_loaded = 1; if (alu.execute_mask) { alu.pred_sel = 0; @@ -1348,6 +1352,31 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen, } } + int col1 = -1, bcol1 = -1, col2 = -1, bcol2 = -1; + unsigned is_eg = rscreen->chip_class >= EVERGREEN; + for (i = 0; i < ctx.shader->ninput; i++) { + if (ctx.shader->input[i].name == TGSI_SEMANTIC_COLOR) { + if (col1 == -1) + col1 = is_eg?ctx.shader->input[i].lds_pos:ctx.shader->input[i].gpr; + else + col2 = is_eg?ctx.shader->input[i].lds_pos:ctx.shader->input[i].gpr; + } + if (ctx.shader->input[i].name == TGSI_SEMANTIC_BCOLOR) { + if (bcol1 == -1) + bcol1 = is_eg?ctx.shader->input[i].lds_pos:ctx.shader->input[i].gpr; + else + bcol2 = is_eg?ctx.shader->input[i].lds_pos:ctx.shader->input[i].gpr; + } + } + + unsigned to_gpr_map[16], input_count = ctx.shader->ninput; + unsigned id = 0; + for (unsigned i = 0; i < input_count; i++) { + if (ctx.shader->input[i].name == TGSI_SEMANTIC_FACE) + continue; + to_gpr_map[id++] = ctx.shader->input[i].gpr; + } + /* LLVM backend setup */ #ifdef R600_USE_LLVM if (use_llvm) { @@ -1364,14 +1393,24 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen, radeon_llvm_ctx.color_buffer_count = MAX2(key.nr_cbufs , 1); radeon_llvm_ctx.chip_class = ctx.bc->chip_class; radeon_llvm_ctx.fs_color_all = shader->fs_write_all && (rscreen->chip_class >= EVERGREEN); - mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens); + if (pipeshader->modinfo) + { + unsigned *input_map = (rscreen->chip_class >= EVERGREEN)? NULL : to_gpr_map; + mod = renumber_input_ref(pipeshader->modinfo, 4 * radeon_llvm_ctx.reserved_reg_count, shader->input[ctx.fragcoord_input].gpr, ctx.face_gpr, + shader->two_side, col1, bcol1, col2, bcol2, radeon_llvm_ctx.color_buffer_count, radeon_llvm_ctx.fs_color_all, input_map); + } + else + mod = r600_tgsi_llvm(&radeon_llvm_ctx, tokens); if (debug_get_bool_option("R600_DUMP_SHADERS", FALSE)) { dump = 1; } if (r600_llvm_compile(mod, &inst_bytes, &inst_byte_count, rscreen->family, dump)) { FREE(inst_bytes); - radeon_llvm_dispose(&radeon_llvm_ctx); + if (pipeshader->modinfo) + LLVMDisposeModule(mod); + else + radeon_llvm_dispose(&radeon_llvm_ctx); use_llvm = 0; fprintf(stderr, "R600 LLVM backend failed to compile " "shader. Falling back to TGSI\n"); @@ -1379,7 +1418,10 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen, ctx.file_offset[TGSI_FILE_OUTPUT] = ctx.file_offset[TGSI_FILE_INPUT]; } - radeon_llvm_dispose(&radeon_llvm_ctx); + if (pipeshader->modinfo) + LLVMDisposeModule(mod); + else + radeon_llvm_dispose(&radeon_llvm_ctx); } #endif /* End of LLVM backend setup */ diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index b58a58ab4d..de93564976 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -70,6 +70,7 @@ struct r600_shader_key { }; struct r600_pipe_shader { + struct LLVMOpaqueModule * modinfo; struct r600_pipe_shader_selector *selector; struct r600_pipe_shader *next_variant; struct r600_shader shader; diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 926cb1ae88..2cb1b5c627 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -33,6 +33,7 @@ #include "util/u_upload_mgr.h" #include "tgsi/tgsi_parse.h" #include <byteswap.h> +#include <llvm-c/Core.h> #define R600_PRIM_RECTANGLE_LIST PIPE_PRIM_MAX @@ -746,6 +747,7 @@ static int r600_shader_select(struct pipe_context *ctx, key = r600_shader_selector_key(ctx, sel); } + shader->modinfo = sel->modinfo; shader->key = key; sel->num_shaders++; } @@ -774,6 +776,7 @@ static void *r600_create_shader_state(struct pipe_context *ctx, sel->type = pipe_shader_type; sel->tokens = tgsi_dup_tokens(state->tokens); sel->so = state->stream_output; + sel->modinfo = state->llvm_module; r = r600_shader_select(ctx, sel, NULL); if (r) @@ -868,6 +871,9 @@ static void r600_delete_ps_state(struct pipe_context *ctx, void *state) rctx->ps_shader = NULL; } + if (sel->modinfo) + LLVMDisposeModule(sel->modinfo); + r600_delete_shader_selector(ctx, sel); } @@ -880,6 +886,9 @@ static void r600_delete_vs_state(struct pipe_context *ctx, void *state) rctx->vs_shader = NULL; } + if (sel->modinfo) + LLVMDisposeModule(sel->modinfo); + r600_delete_shader_selector(ctx, sel); } diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.cpp b/src/gallium/drivers/radeon/radeon_llvm_emit.cpp index 21661a0500..045b090712 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.cpp +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.cpp @@ -128,6 +128,7 @@ radeon_llvm_compile(LLVMModuleRef M, unsigned char ** bytes, #else PM.add(new DataLayout(*AMDGPUTargetMachine.getDataLayout())); #endif + PM.add(createScalarReplAggregatesPass(4096)); PM.add(createPromoteMemoryToRegisterPass()); AMDGPUTargetMachine.setAsmVerbosityDefault(true); diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index f84bfd79d6..d3d2d371cb 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -49,6 +49,7 @@ extern "C" { #endif +typedef struct LLVMOpaqueModule * LLVMModuleRef; /** * Implementation limits @@ -209,6 +210,7 @@ struct pipe_stream_output_info struct pipe_shader_state { const struct tgsi_token *tokens; + LLVMModuleRef llvm_module; struct pipe_stream_output_info stream_output; }; diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index c030a6b372..6481327409 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -45,6 +45,7 @@ #include "main/mtypes.h" #include "main/shaderobj.h" #include "program/hash_table.h" +#include "st_glsl_to_llvm.h" extern "C" { #include "main/shaderapi.h" @@ -4997,6 +4998,32 @@ get_mesa_program(struct gl_context *ctx, return prog; } +extern "C" +void * st_glsl_to_llvm_visit(glsl_to_tgsi_visitor *glsl_to_tgsi, unsigned shader_type, unsigned clamp_color) +{ + const exec_list *ir; + if (!glsl_to_tgsi->shader_program) + return NULL; + switch (shader_type) { + case GL_FRAGMENT_SHADER: + if (glsl_to_tgsi->shader_program->_LinkedShaders[1]) + ir = glsl_to_tgsi->shader_program->_LinkedShaders[1]->ir; + else + return NULL; + break; + case GL_VERTEX_SHADER: + if (glsl_to_tgsi->shader_program->_LinkedShaders[0]) + ir = glsl_to_tgsi->shader_program->_LinkedShaders[0]->ir; + else + return NULL; + break; + default: + abort(); + } + + return glsl_to_llvm_visit(ir, glsl_to_tgsi->shader_program, glsl_to_tgsi->prog, shader_type, clamp_color > 0); +} + extern "C" { struct gl_shader * diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.h b/src/mesa/state_tracker/st_glsl_to_tgsi.h index a3fe91f7e8..9880460758 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.h +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.h @@ -34,6 +34,8 @@ struct gl_shader; struct gl_shader_program; struct glsl_to_tgsi_visitor; +void * st_glsl_to_llvm_visit(struct glsl_to_tgsi_visitor *, unsigned, unsigned); + enum pipe_error st_translate_program( struct gl_context *ctx, uint procType, diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index a9111b523a..4efc1aa418 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -52,6 +52,7 @@ #include "st_context.h" #include "st_program.h" #include "st_mesa_to_tgsi.h" +#include "st_glsl_to_llvm.h" #include "cso_cache/cso_context.h" @@ -332,7 +333,7 @@ st_translate_vertex_program(struct st_context *st, debug_printf("\n"); } - if (stvp->glsl_to_tgsi) + if (stvp->glsl_to_tgsi) { error = st_translate_program(st->ctx, TGSI_PROCESSOR_VERTEX, ureg, @@ -352,7 +353,9 @@ st_translate_vertex_program(struct st_context *st, stvp->output_semantic_index, key->passthrough_edgeflags, key->clamp_color); - else + if (_mesa_getenv("GLSL_TO_LLVM")) + vpv->tgsi.llvm_module = st_glsl_to_llvm_visit(stvp->glsl_to_tgsi, GL_VERTEX_SHADER, key->clamp_color); + } else error = st_translate_mesa_program(st->ctx, TGSI_PROCESSOR_VERTEX, ureg, @@ -702,7 +705,7 @@ st_translate_fragment_program(struct st_context *st, } } - if (stfp->glsl_to_tgsi) + if (stfp->glsl_to_tgsi) { st_translate_program(st->ctx, TGSI_PROCESSOR_FRAGMENT, ureg, @@ -721,7 +724,9 @@ st_translate_fragment_program(struct st_context *st, fs_output_semantic_name, fs_output_semantic_index, FALSE, key->clamp_color ); - else + if (_mesa_getenv("GLSL_TO_LLVM")) + variant->tgsi.llvm_module = st_glsl_to_llvm_visit(stfp->glsl_to_tgsi, GL_FRAGMENT_SHADER, key->clamp_color); + } else st_translate_mesa_program(st->ctx, TGSI_PROCESSOR_FRAGMENT, ureg, diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index 23a262cccc..62f73ef514 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -39,6 +39,7 @@ #include "pipe/p_state.h" #include "st_context.h" #include "st_glsl_to_tgsi.h" +#include <llvm-c/Core.h> /** Fragment program variant key */ @@ -90,6 +91,7 @@ struct st_fragment_program { struct gl_fragment_program Base; struct glsl_to_tgsi_visitor* glsl_to_tgsi; + LLVMModuleRef llvm_module; struct st_fp_variant *variants; }; @@ -145,6 +147,7 @@ struct st_vertex_program { struct gl_vertex_program Base; /**< The Mesa vertex program */ struct glsl_to_tgsi_visitor* glsl_to_tgsi; + LLVMModuleRef llvm_module; /** maps a Mesa VERT_ATTRIB_x to a packed TGSI input index */ GLuint input_to_index[VERT_ATTRIB_MAX]; |