summaryrefslogtreecommitdiffstats
path: root/src/mesa/pipe
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/pipe')
-rw-r--r--src/mesa/pipe/llvm/llvmtgsi.cpp158
-rw-r--r--src/mesa/pipe/llvm/llvmtgsi.h27
-rw-r--r--src/mesa/pipe/p_state.h3
-rw-r--r--src/mesa/pipe/softpipe/sp_quad_fs.c3
4 files changed, 191 insertions, 0 deletions
diff --git a/src/mesa/pipe/llvm/llvmtgsi.cpp b/src/mesa/pipe/llvm/llvmtgsi.cpp
new file mode 100644
index 00000000000..857eb1cce1e
--- /dev/null
+++ b/src/mesa/pipe/llvm/llvmtgsi.cpp
@@ -0,0 +1,158 @@
+#include "llvmtgsi.h"
+
+#include "pipe/tgsi/exec/tgsi_exec.h"
+#include "pipe/tgsi/exec/tgsi_token.h"
+#include "pipe/tgsi/exec/tgsi_build.h"
+#include "pipe/tgsi/exec/tgsi_util.h"
+#include "pipe/tgsi/exec/tgsi_parse.h"
+#include "pipe/tgsi/exec/tgsi_dump.h"
+//#include "pipe/tgsi/tgsi_platform.h"
+
+#include <llvm/Module.h>
+#include <llvm/CallingConv.h>
+#include <llvm/Constants.h>
+#include <llvm/DerivedTypes.h>
+#include <llvm/Instructions.h>
+#include <llvm/ModuleProvider.h>
+#include <llvm/ParameterAttributes.h>
+#include <llvm/Support/PatternMatch.h>
+#include <llvm/ExecutionEngine/JIT.h>
+#include <llvm/ExecutionEngine/Interpreter.h>
+#include <llvm/ExecutionEngine/GenericValue.h>
+#include <llvm/Support/MemoryBuffer.h>
+#include <llvm/Bitcode/ReaderWriter.h>
+#include <iostream>
+
+
+static void
+translate_declaration(llvm::Module *module,
+ struct tgsi_full_declaration *decl,
+ struct tgsi_full_declaration *fd)
+{
+}
+
+
+static void
+translate_immediate(llvm::Module *module,
+ struct tgsi_full_immediate *imm)
+{
+}
+
+
+static void
+translate_instruction(llvm::Module *module,
+ struct tgsi_full_instruction *inst,
+ struct tgsi_full_instruction *fi)
+{
+}
+
+
+static llvm::Module *
+tgsi_to_llvm(const struct tgsi_token *tokens)
+{
+ llvm::Module *mod = new llvm::Module("tgsi");
+ struct tgsi_parse_context parse;
+ struct tgsi_full_instruction fi;
+ struct tgsi_full_declaration fd;
+
+ tgsi_parse_init(&parse, tokens);
+
+ //parse.FullHeader.Processor.Processor
+
+ //parse.FullVersion.Version.MajorVersion
+ //parse.FullVersion.Version.MinorVersion
+
+ //parse.FullHeader.Header.HeaderSize
+ //parse.FullHeader.Header.BodySize
+ //parse.FullHeader.Processor.Processor
+
+ fi = tgsi_default_full_instruction();
+ fd = tgsi_default_full_declaration();
+
+ while(!tgsi_parse_end_of_tokens(&parse)) {
+ tgsi_parse_token(&parse);
+
+ fprintf(stderr, "Translating %d\n", parse.FullToken.Token.Type);
+
+ switch (parse.FullToken.Token.Type) {
+ case TGSI_TOKEN_TYPE_DECLARATION:
+ translate_declaration(mod,
+ &parse.FullToken.FullDeclaration,
+ &fd);
+ break;
+
+ case TGSI_TOKEN_TYPE_IMMEDIATE:
+ translate_immediate(mod,
+ &parse.FullToken.FullImmediate);
+ break;
+
+ case TGSI_TOKEN_TYPE_INSTRUCTION:
+ translate_instruction(mod,
+ &parse.FullToken.FullInstruction,
+ &fi);
+ break;
+
+ default:
+ assert(0);
+ }
+ }
+
+ //TXT("\ntgsi-dump end -------------------\n");
+
+ tgsi_parse_free(&parse);
+
+ return mod;
+}
+
+struct ga_llvm_prog *
+ga_llvm_from_tgsi(const struct tgsi_token *tokens)
+{
+ std::cout << "Creating llvm " <<std::endl;
+ struct ga_llvm_prog *ga_llvm =
+ (struct ga_llvm_prog *)malloc(sizeof(struct ga_llvm_prog));
+ llvm::Module *mod = tgsi_to_llvm(tokens);
+ llvm::ExistingModuleProvider *mp =
+ new llvm::ExistingModuleProvider(mod);
+ //llvm::ExecutionEngine *ee =
+ // llvm::ExecutionEngine::create(mp, false);
+
+ ga_llvm->module = mod;
+ ga_llvm->engine = 0;//ee;
+ fprintf(stderr, "DUMPX \n");
+ //tgsi_dump(tokens, TGSI_DUMP_VERBOSE);
+ tgsi_dump(tokens, 0);
+ fprintf(stderr, "DUMPEND \n");
+
+ return ga_llvm;
+}
+
+void ga_llvm_prog_delete(struct ga_llvm_prog *prog)
+{
+ llvm::Module *mod = static_cast<llvm::Module*>(prog->module);
+ delete mod;
+ prog->module = 0;
+ prog->engine = 0;
+ free(prog);
+}
+
+int ga_llvm_prog_exec(struct ga_llvm_prog *prog)
+{
+ //std::cout << "START "<<std::endl;
+ llvm::Module *mod = static_cast<llvm::Module*>(prog->module);
+ llvm::Function *func = mod->getFunction("main");
+ llvm::ExecutionEngine *ee = static_cast<llvm::ExecutionEngine*>(prog->engine);
+
+ std::vector<llvm::GenericValue> args(0);
+ //args[0] = GenericValue(&st);
+ //std::cout << "Mod is "<<*mod;
+ //std::cout << "\n\nRunning llvm: " << std::endl;
+ if (func) {
+ std::cout << "Func is "<<func;
+ llvm::GenericValue gv = ee->runFunction(func, args);
+ }
+
+//delete ee;
+//delete mp;
+
+ return 0;
+}
diff --git a/src/mesa/pipe/llvm/llvmtgsi.h b/src/mesa/pipe/llvm/llvmtgsi.h
new file mode 100644
index 00000000000..c0cee915b92
--- /dev/null
+++ b/src/mesa/pipe/llvm/llvmtgsi.h
@@ -0,0 +1,27 @@
+#ifndef LLVMTGSI_H
+#define LLVMTGSI_H
+
+#if defined __cplusplus
+extern "C" {
+#endif
+
+struct tgsi_exec_machine;
+struct tgsi_token;
+struct tgsi_sampler;
+
+struct ga_llvm_prog {
+ void *module;
+ void *engine;
+};
+struct ga_llvm_prog *
+ga_llvm_from_tgsi(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);
+
+#if defined __cplusplus
+} // extern "C"
+#endif
+
+#endif
diff --git a/src/mesa/pipe/p_state.h b/src/mesa/pipe/p_state.h
index 4a18d25ab89..69b11588e07 100644
--- a/src/mesa/pipe/p_state.h
+++ b/src/mesa/pipe/p_state.h
@@ -58,6 +58,7 @@
/* fwd decl */
struct pipe_surface;
+struct ga_llvm_prog;
/* opaque type */
struct pipe_buffer_handle;
@@ -153,6 +154,8 @@ struct pipe_shader_state {
#endif
void (*executable)();
+ const struct ga_llvm_prog *llvm_prog;
+
ubyte num_inputs;
ubyte num_outputs;
ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
diff --git a/src/mesa/pipe/softpipe/sp_quad_fs.c b/src/mesa/pipe/softpipe/sp_quad_fs.c
index 9f85f7c30ce..035f05170bc 100644
--- a/src/mesa/pipe/softpipe/sp_quad_fs.c
+++ b/src/mesa/pipe/softpipe/sp_quad_fs.c
@@ -35,6 +35,8 @@
#include "pipe/p_util.h"
#include "pipe/p_defines.h"
+#include "pipe/llvm/llvmtgsi.h"
+
#include "sp_context.h"
#include "sp_headers.h"
#include "sp_quad.h"
@@ -107,6 +109,7 @@ shade_quad(
machine->InterpCoefs );
}
else {
+ ga_llvm_prog_exec(softpipe->fs->llvm_prog);
quad->mask &= tgsi_exec_machine_run( machine );
}