summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZack Rusin <[email protected]>2007-10-15 09:59:19 -0400
committerZack Rusin <[email protected]>2007-10-24 11:21:03 -0400
commit5ffdada717466a78b5b148764ba23c7a95098887 (patch)
treec7005dde4cfd245d650b21278f8d358397a34564
parent9e6d58fac26a12246e9e560f3802ebcbce2423bc (diff)
Execution engine is a singleton, for now keep it in the pipe.
-rw-r--r--src/mesa/Makefile6
-rw-r--r--src/mesa/pipe/draw/draw_vertex_shader_llvm.c34
-rw-r--r--src/mesa/pipe/llvm/llvmtgsi.cpp30
-rw-r--r--src/mesa/pipe/llvm/llvmtgsi.h5
-rw-r--r--src/mesa/pipe/p_context.h4
-rw-r--r--src/mesa/state_tracker/st_program.c4
6 files changed, 64 insertions, 19 deletions
diff --git a/src/mesa/Makefile b/src/mesa/Makefile
index cb7c466f475..5b56f76e0be 100644
--- a/src/mesa/Makefile
+++ b/src/mesa/Makefile
@@ -113,11 +113,11 @@ osmesa-only: depend subdirs $(TOP)/$(LIB_DIR)/$(OSMESA_LIB_NAME)
# Make the GL library
$(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(STAND_ALONE_OBJECTS) $(SOFTPIPE_LIB)
- @ $(TOP)/bin/mklib -o $(GL_LIB) -linker '$(CC)' \
+ $(TOP)/bin/mklib -o $(GL_LIB) -linker '$(CC)' \
-major $(GL_MAJOR) -minor $(GL_MINOR) -patch $(GL_TINY) \
-install $(TOP)/$(LIB_DIR) \
- $(MKLIB_OPTIONS) $(GL_LIB_DEPS) $(STAND_ALONE_OBJECTS) \
- $(SOFTPIPE_LIB)
+ $(MKLIB_OPTIONS) $(STAND_ALONE_OBJECTS) \
+ $(SOFTPIPE_LIB) $(GL_LIB_DEPS)
# Make the OSMesa library
$(TOP)/$(LIB_DIR)/$(OSMESA_LIB_NAME): $(OSMESA_DRIVER_OBJECTS) $(OSMESA16_OBJECTS)
diff --git a/src/mesa/pipe/draw/draw_vertex_shader_llvm.c b/src/mesa/pipe/draw/draw_vertex_shader_llvm.c
index fd499010516..37315f75662 100644
--- a/src/mesa/pipe/draw/draw_vertex_shader_llvm.c
+++ b/src/mesa/pipe/draw/draw_vertex_shader_llvm.c
@@ -98,6 +98,10 @@ void vertex_fetch(struct draw_context *draw,
}
}
+void execute_shader(void *dests, void *inputs, void *consts)
+{
+ fprintf(stderr, "EXECUTING--\n");
+}
/**
* Called by the draw module when the vertx cache needs to be flushed.
@@ -109,10 +113,33 @@ void draw_vertex_shader_queue_flush_llvm(struct draw_context *draw)
struct vertex_header *dests[VS_QUEUE_LENGTH];
float inputs[VS_QUEUE_LENGTH][PIPE_MAX_SHADER_INPUTS][4];
+ float outputs[VS_QUEUE_LENGTH][PIPE_MAX_SHADER_INPUTS][4];
float (*consts)[4] = (float (*)[4]) draw->mapped_constants;
struct ga_llvm_prog *prog = draw->vertex_shader->state->llvm_prog;
- fprintf(stderr, "--- XX q(%d) ", draw->vs.queue_nr);
+ fprintf(stderr, "--- XX q(%d) \n", draw->vs.queue_nr);
+ /* Consts does not require 16 byte alignment. */
+ fprintf(stderr, "0AAAAA = %f %f %f %f\n",
+ consts[0][0],
+ consts[0][1],
+ consts[0][2],
+ consts[0][3]);
+
+ fprintf(stderr, "1AAAAA = %f %f %f %f\n",
+ consts[1][0],
+ consts[1][1],
+ consts[1][2],
+ consts[1][3]);
+ fprintf(stderr, "2AAAAA = %f %f %f %f\n",
+ consts[2][0],
+ consts[2][1],
+ consts[2][2],
+ consts[2][3]);
+ fprintf(stderr, "3AAAAA = %f %f %f %f\n",
+ consts[3][0],
+ consts[3][1],
+ consts[3][2],
+ consts[3][3]);
/* fetch the inputs */
for (i = 0; i < draw->vs.queue_nr; ++i) {
@@ -122,9 +149,12 @@ void draw_vertex_shader_queue_flush_llvm(struct draw_context *draw)
}
/* batch execute the shaders on all the vertices */
- ga_llvm_prog_exec(prog, inputs, dests, consts,
+ ga_llvm_prog_exec(prog, inputs, outputs, consts,
draw->vs.queue_nr,
draw->vertex_info.num_attribs);
+ /* FIXME: finish conversion */
+ /* dests = outputs */
+
draw->vs.queue_nr = 0;
}
diff --git a/src/mesa/pipe/llvm/llvmtgsi.cpp b/src/mesa/pipe/llvm/llvmtgsi.cpp
index 1abc148521f..a616355f8fd 100644
--- a/src/mesa/pipe/llvm/llvmtgsi.cpp
+++ b/src/mesa/pipe/llvm/llvmtgsi.cpp
@@ -1,5 +1,6 @@
#include "llvmtgsi.h"
+#include "pipe/p_context.h"
#include "pipe/tgsi/exec/tgsi_exec.h"
#include "pipe/tgsi/exec/tgsi_token.h"
#include "pipe/tgsi/exec/tgsi_build.h"
@@ -469,7 +470,7 @@ tgsi_to_llvm(const struct tgsi_token *tokens)
}
struct ga_llvm_prog *
-ga_llvm_from_tgsi(const struct tgsi_token *tokens)
+ga_llvm_from_tgsi(struct pipe_context *pipe, const struct tgsi_token *tokens)
{
std::cout << "Creating llvm " <<std::endl;
struct ga_llvm_prog *ga_llvm =
@@ -487,20 +488,24 @@ ga_llvm_from_tgsi(const struct tgsi_token *tokens)
llvm::ExistingModuleProvider *mp =
new llvm::ExistingModuleProvider(mod);
- llvm::ExecutionEngine *ee =
- llvm::ExecutionEngine::create(mp, false);
-
+ llvm::ExecutionEngine *ee = 0;
+ if (!pipe->llvm_execution_engine) {
+ ee = llvm::ExecutionEngine::create(mp, false);
+ pipe->llvm_execution_engine = ee;
+ } else {
+ ee = (llvm::ExecutionEngine*)pipe->llvm_execution_engine;
+ ee->addModuleProvider(mp);
+ }
ga_llvm->module = mod;
- ga_llvm->engine = ee;
fprintf(stderr, "DUMPX \n");
//tgsi_dump(tokens, TGSI_DUMP_VERBOSE);
tgsi_dump(tokens, 0);
fprintf(stderr, "DUMPEND \n");
Function *func = mod->getFunction("run_vertex_shader");
- std::cout << "run_vertex_shader = "<<func;
+ std::cout << "run_vertex_shader = "<<func<<std::endl;
ga_llvm->function = ee->getPointerToFunctionOrStub(func);
- std::cout << " -- FUNC is " <<ga_llvm->function;
+ std::cout << " -- FUNC is " <<ga_llvm->function<<std::endl;
return ga_llvm;
}
@@ -515,15 +520,22 @@ void ga_llvm_prog_delete(struct ga_llvm_prog *prog)
free(prog);
}
+typedef void (*vertex_shader_runner)(float (*ainputs)[32][4],
+ float (*dests)[32][4],
+ float (*aconsts)[4],
+ int count,
+ int num_attribs);
+
int ga_llvm_prog_exec(struct ga_llvm_prog *prog,
float (*inputs)[32][4],
- void *dests[16*32*4],
+ float (*dests)[32][4],
float (*consts)[4],
int count,
int num_attribs)
{
std::cout << "---- START LLVM Execution "<<std::endl;
-
+ vertex_shader_runner runner = reinterpret_cast<vertex_shader_runner>(prog->function);
+ runner(inputs, dests, consts, count, num_attribs);
std::cout << "---- END LLVM Execution "<<std::endl;
return 0;
diff --git a/src/mesa/pipe/llvm/llvmtgsi.h b/src/mesa/pipe/llvm/llvmtgsi.h
index b1b5717f6d0..f78fbce4c61 100644
--- a/src/mesa/pipe/llvm/llvmtgsi.h
+++ b/src/mesa/pipe/llvm/llvmtgsi.h
@@ -8,6 +8,7 @@ extern "C" {
struct tgsi_exec_machine;
struct tgsi_token;
struct tgsi_sampler;
+struct pipe_context;
struct ga_llvm_prog {
void *module;
@@ -15,13 +16,13 @@ struct ga_llvm_prog {
void *function;
};
struct ga_llvm_prog *
-ga_llvm_from_tgsi(const struct tgsi_token *tokens);
+ga_llvm_from_tgsi(struct pipe_context *pipe, const struct tgsi_token *tokens);
void ga_llvm_prog_delete(struct ga_llvm_prog *prog);
int ga_llvm_prog_exec(struct ga_llvm_prog *prog,
float (*inputs)[32][4],
- void *dests[16*32*4],
+ float (*dests)[32][4],
float (*consts)[4],
int count,
int num_attribs);
diff --git a/src/mesa/pipe/p_context.h b/src/mesa/pipe/p_context.h
index 8ba1031efe5..2558a6341ce 100644
--- a/src/mesa/pipe/p_context.h
+++ b/src/mesa/pipe/p_context.h
@@ -38,7 +38,9 @@ struct pipe_state_cache;
*/
struct pipe_context {
struct pipe_winsys *winsys;
-
+
+ void *llvm_execution_engine;
+
void (*destroy)( struct pipe_context * );
/*
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index edb2703101f..0f9d7692642 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -251,7 +251,7 @@ st_translate_vertex_program(struct st_context *st,
tokensOut, maxTokens);
vs.tokens = tokensOut;
- vs.llvm_prog = ga_llvm_from_tgsi(vs.tokens);
+ vs.llvm_prog = ga_llvm_from_tgsi(st->pipe, vs.tokens);
cso = st_cached_vs_state(st, &vs);
stvp->vs = cso;
@@ -407,7 +407,7 @@ st_translate_fragment_program(struct st_context *st,
tokensOut, maxTokens);
fs.tokens = tokensOut;
- fs.llvm_prog = ga_llvm_from_tgsi(fs.tokens);
+ fs.llvm_prog = ga_llvm_from_tgsi(st->pipe, fs.tokens);
cso = st_cached_fs_state(st, &fs);
stfp->fs = cso;