Initial stab at LLVM integration.

This commit is contained in:
Zack Rusin
2007-10-08 10:24:35 -04:00
parent 4664261f8d
commit b2e529982e
8 changed files with 225 additions and 5 deletions

View File

@@ -65,10 +65,29 @@ DRIVER_DIRS = x11 osmesa
# Which subdirs under $(TOP)/progs/ to enter:
PROGRAM_DIRS = demos redbook samples glsl xdemos
LLVM_VERSION := $(shell llvm-config --version)
ifeq ($(LLVM_VERSION),)
$(warning Could not find LLVM! Make Sure 'llvm-config' is in the path)
MESA_NO_LLVM=1
else
MESA_NO_LLVM=0
$(info Using LLVM version: $(LLVM_VERSION))
endif
ifeq ($(MESA_NO_LLVM),0)
LLVM_CFLAGS=`llvm-config --cflags` -DMESA_NO_LLVM=0
LLVM_CXXFLAGS=`llvm-config --cxxflags` -DMESA_NO_LLVM=0 -Wno-long-long
LLVM_LDFLAGS=`llvm-config --ldflags`
LLVM_LIBS=`llvm-config --libs`
else
LLVM_CFLAGS=-DMESA_NO_LLVM=1
LLVM_CXXFLAGS=-DMESA_NO_LLVM=1
endif
# Library/program dependencies
#EXTRA_LIB_PATH ?=
GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lm -lpthread
GL_LIB_DEPS = $(LLVM_LDFLAGS) $(LLVM_LIBS) $(EXTRA_LIB_PATH) -lX11 -lXext -lm -lpthread
OSMESA_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB)
GLU_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GL_LIB) -lm
GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) $(EXTRA_LIB_PATH) -lX11 -lXmu -lXt -lXi -lm

View File

@@ -16,10 +16,10 @@ SOFTPIPE_LIB = $(TOP)/src/mesa/pipe/softpipe/libsoftpipe.a
.SUFFIXES : .cpp
.c.o:
$(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
$(CC) -c $(LLVM_CFLAGS) $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
.cpp.o:
$(CXX) -c $(INCLUDE_DIRS) $(CXXFLAGS) $< -o $@
$(CXX) -c $(LLVM_CXXFLAGS) $(INCLUDE_DIRS) $(CXXFLAGS) $< -o $@
.S.o:
$(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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 */

View File

@@ -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 );
}

View File

@@ -188,6 +188,11 @@ TGSIDECO_SOURCES = \
TGSIMESA_SOURCES = \
pipe/tgsi/mesa/mesa_to_tgsi.c
ifeq ($(MESA_NO_LLVM),0)
LLVMTGSI_SOURCES = \
pipe/llvm/llvmtgsi.cpp
endif
STATECACHE_SOURCES = \
pipe/cso_cache/cso_hash.c \
pipe/cso_cache/cso_cache.c
@@ -366,6 +371,7 @@ FBDEV_DRIVER_SOURCES = \
ALL_SOURCES = \
$(GLAPI_SOURCES) \
$(SOLO_SOURCES) \
$(LLVMTGSI_SOURCES) \
$(ASM_SOURCES) \
$(COMMON_DRIVER_SOURCES)\
$(X11_DRIVER_SOURCES) \
@@ -392,13 +398,15 @@ SOLO_SOURCES = \
CORE_SOURCES = \
$(GLAPI_SOURCES) \
$(SOLO_SOURCES)
$(SOLO_SOURCES) \
$(LLVMTGSI_SOURCES)
### Object files
SOLO_OBJECTS = \
$(SOLO_SOURCES:.c=.o) \
$(LLVMTGSI_SOURCES:.cpp=.o) \
$(ASM_SOURCES:.S=.o)
GLAPI_OBJECTS = \

View File

@@ -39,6 +39,7 @@
#include "pipe/draw/draw_context.h"
#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
#include "pipe/tgsi/exec/tgsi_core.h"
#include "pipe/llvm/llvmtgsi.h"
#include "st_context.h"
#include "st_cache.h"
@@ -250,6 +251,7 @@ st_translate_vertex_program(struct st_context *st,
tokensOut, maxTokens);
vs.tokens = tokensOut;
vs.llvm_prog = ga_llvm_from_tgsi(vs.tokens);
cso = st_cached_vs_state(st, &vs);
stvp->vs = cso;
@@ -405,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);
cso = st_cached_fs_state(st, &fs);
stfp->fs = cso;