summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Lejeune <vljn@ovi.com>2012-07-14 18:49:35 +0200
committerVincent Lejeune <vljn@ovi.com>2012-12-05 19:14:42 +0100
commit378c8c7df16f3aff0727eb3d407c9f18a487928a (patch)
treeb8bad16707126ac40bb473de102ea9bfeaf3fcad
parentde99a70f6cbe8423191dc259fe9582673148bf5b (diff)
gallium/radeon: enable glsl-to-llvmglsl-to-llvm-05nov
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_ureg.c2
-rw-r--r--src/gallium/drivers/r600/r600_pipe.h1
-rw-r--r--src/gallium/drivers/r600/r600_shader.c48
-rw-r--r--src/gallium/drivers/r600/r600_shader.h1
-rw-r--r--src/gallium/drivers/r600/r600_state_common.c9
-rw-r--r--src/gallium/drivers/radeon/radeon_llvm_emit.cpp1
-rw-r--r--src/gallium/include/pipe/p_state.h2
-rw-r--r--src/mesa/state_tracker/st_glsl_to_tgsi.cpp27
-rw-r--r--src/mesa/state_tracker/st_glsl_to_tgsi.h2
-rw-r--r--src/mesa/state_tracker/st_program.c13
-rw-r--r--src/mesa/state_tracker/st_program.h3
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];