Execution engine is a singleton, for now keep it in the pipe.
This commit is contained in:
@@ -113,11 +113,11 @@ osmesa-only: depend subdirs $(TOP)/$(LIB_DIR)/$(OSMESA_LIB_NAME)
|
|||||||
|
|
||||||
# Make the GL library
|
# Make the GL library
|
||||||
$(TOP)/$(LIB_DIR)/$(GL_LIB_NAME): $(STAND_ALONE_OBJECTS) $(SOFTPIPE_LIB)
|
$(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) \
|
-major $(GL_MAJOR) -minor $(GL_MINOR) -patch $(GL_TINY) \
|
||||||
-install $(TOP)/$(LIB_DIR) \
|
-install $(TOP)/$(LIB_DIR) \
|
||||||
$(MKLIB_OPTIONS) $(GL_LIB_DEPS) $(STAND_ALONE_OBJECTS) \
|
$(MKLIB_OPTIONS) $(STAND_ALONE_OBJECTS) \
|
||||||
$(SOFTPIPE_LIB)
|
$(SOFTPIPE_LIB) $(GL_LIB_DEPS)
|
||||||
|
|
||||||
# Make the OSMesa library
|
# Make the OSMesa library
|
||||||
$(TOP)/$(LIB_DIR)/$(OSMESA_LIB_NAME): $(OSMESA_DRIVER_OBJECTS) $(OSMESA16_OBJECTS)
|
$(TOP)/$(LIB_DIR)/$(OSMESA_LIB_NAME): $(OSMESA_DRIVER_OBJECTS) $(OSMESA16_OBJECTS)
|
||||||
|
@@ -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.
|
* 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];
|
struct vertex_header *dests[VS_QUEUE_LENGTH];
|
||||||
float inputs[VS_QUEUE_LENGTH][PIPE_MAX_SHADER_INPUTS][4];
|
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;
|
float (*consts)[4] = (float (*)[4]) draw->mapped_constants;
|
||||||
struct ga_llvm_prog *prog = draw->vertex_shader->state->llvm_prog;
|
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 */
|
/* fetch the inputs */
|
||||||
for (i = 0; i < draw->vs.queue_nr; ++i) {
|
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 */
|
/* 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->vs.queue_nr,
|
||||||
draw->vertex_info.num_attribs);
|
draw->vertex_info.num_attribs);
|
||||||
|
|
||||||
|
/* FIXME: finish conversion */
|
||||||
|
/* dests = outputs */
|
||||||
|
|
||||||
draw->vs.queue_nr = 0;
|
draw->vs.queue_nr = 0;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
#include "llvmtgsi.h"
|
#include "llvmtgsi.h"
|
||||||
|
|
||||||
|
#include "pipe/p_context.h"
|
||||||
#include "pipe/tgsi/exec/tgsi_exec.h"
|
#include "pipe/tgsi/exec/tgsi_exec.h"
|
||||||
#include "pipe/tgsi/exec/tgsi_token.h"
|
#include "pipe/tgsi/exec/tgsi_token.h"
|
||||||
#include "pipe/tgsi/exec/tgsi_build.h"
|
#include "pipe/tgsi/exec/tgsi_build.h"
|
||||||
@@ -469,7 +470,7 @@ tgsi_to_llvm(const struct tgsi_token *tokens)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ga_llvm_prog *
|
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;
|
std::cout << "Creating llvm " <<std::endl;
|
||||||
struct ga_llvm_prog *ga_llvm =
|
struct ga_llvm_prog *ga_llvm =
|
||||||
@@ -487,20 +488,24 @@ ga_llvm_from_tgsi(const struct tgsi_token *tokens)
|
|||||||
|
|
||||||
llvm::ExistingModuleProvider *mp =
|
llvm::ExistingModuleProvider *mp =
|
||||||
new llvm::ExistingModuleProvider(mod);
|
new llvm::ExistingModuleProvider(mod);
|
||||||
llvm::ExecutionEngine *ee =
|
llvm::ExecutionEngine *ee = 0;
|
||||||
llvm::ExecutionEngine::create(mp, false);
|
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->module = mod;
|
||||||
ga_llvm->engine = ee;
|
|
||||||
fprintf(stderr, "DUMPX \n");
|
fprintf(stderr, "DUMPX \n");
|
||||||
//tgsi_dump(tokens, TGSI_DUMP_VERBOSE);
|
//tgsi_dump(tokens, TGSI_DUMP_VERBOSE);
|
||||||
tgsi_dump(tokens, 0);
|
tgsi_dump(tokens, 0);
|
||||||
fprintf(stderr, "DUMPEND \n");
|
fprintf(stderr, "DUMPEND \n");
|
||||||
|
|
||||||
Function *func = mod->getFunction("run_vertex_shader");
|
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);
|
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;
|
return ga_llvm;
|
||||||
}
|
}
|
||||||
@@ -515,15 +520,22 @@ void ga_llvm_prog_delete(struct ga_llvm_prog *prog)
|
|||||||
free(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,
|
int ga_llvm_prog_exec(struct ga_llvm_prog *prog,
|
||||||
float (*inputs)[32][4],
|
float (*inputs)[32][4],
|
||||||
void *dests[16*32*4],
|
float (*dests)[32][4],
|
||||||
float (*consts)[4],
|
float (*consts)[4],
|
||||||
int count,
|
int count,
|
||||||
int num_attribs)
|
int num_attribs)
|
||||||
{
|
{
|
||||||
std::cout << "---- START LLVM Execution "<<std::endl;
|
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;
|
std::cout << "---- END LLVM Execution "<<std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -8,6 +8,7 @@ extern "C" {
|
|||||||
struct tgsi_exec_machine;
|
struct tgsi_exec_machine;
|
||||||
struct tgsi_token;
|
struct tgsi_token;
|
||||||
struct tgsi_sampler;
|
struct tgsi_sampler;
|
||||||
|
struct pipe_context;
|
||||||
|
|
||||||
struct ga_llvm_prog {
|
struct ga_llvm_prog {
|
||||||
void *module;
|
void *module;
|
||||||
@@ -15,13 +16,13 @@ struct ga_llvm_prog {
|
|||||||
void *function;
|
void *function;
|
||||||
};
|
};
|
||||||
struct ga_llvm_prog *
|
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);
|
void ga_llvm_prog_delete(struct ga_llvm_prog *prog);
|
||||||
|
|
||||||
int ga_llvm_prog_exec(struct ga_llvm_prog *prog,
|
int ga_llvm_prog_exec(struct ga_llvm_prog *prog,
|
||||||
float (*inputs)[32][4],
|
float (*inputs)[32][4],
|
||||||
void *dests[16*32*4],
|
float (*dests)[32][4],
|
||||||
float (*consts)[4],
|
float (*consts)[4],
|
||||||
int count,
|
int count,
|
||||||
int num_attribs);
|
int num_attribs);
|
||||||
|
@@ -39,6 +39,8 @@ struct pipe_state_cache;
|
|||||||
struct pipe_context {
|
struct pipe_context {
|
||||||
struct pipe_winsys *winsys;
|
struct pipe_winsys *winsys;
|
||||||
|
|
||||||
|
void *llvm_execution_engine;
|
||||||
|
|
||||||
void (*destroy)( struct pipe_context * );
|
void (*destroy)( struct pipe_context * );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -251,7 +251,7 @@ st_translate_vertex_program(struct st_context *st,
|
|||||||
tokensOut, maxTokens);
|
tokensOut, maxTokens);
|
||||||
|
|
||||||
vs.tokens = tokensOut;
|
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);
|
cso = st_cached_vs_state(st, &vs);
|
||||||
stvp->vs = cso;
|
stvp->vs = cso;
|
||||||
|
|
||||||
@@ -407,7 +407,7 @@ st_translate_fragment_program(struct st_context *st,
|
|||||||
tokensOut, maxTokens);
|
tokensOut, maxTokens);
|
||||||
|
|
||||||
fs.tokens = tokensOut;
|
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);
|
cso = st_cached_fs_state(st, &fs);
|
||||||
stfp->fs = cso;
|
stfp->fs = cso;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user