diff options
Diffstat (limited to 'src/mesa/pipe')
-rw-r--r-- | src/mesa/pipe/Makefile.template | 2 | ||||
-rw-r--r-- | src/mesa/pipe/draw/draw_vertex_shader.c | 6 | ||||
-rw-r--r-- | src/mesa/pipe/draw/draw_vertex_shader_llvm.c | 2 | ||||
-rw-r--r-- | src/mesa/pipe/llvm/gallivm.cpp (renamed from src/mesa/pipe/llvm/llvmtgsi.cpp) | 10 | ||||
-rw-r--r-- | src/mesa/pipe/llvm/gallivm.h (renamed from src/mesa/pipe/llvm/llvmtgsi.h) | 1 | ||||
-rw-r--r-- | src/mesa/pipe/softpipe/sp_quad_fs.c | 70 | ||||
-rw-r--r-- | src/mesa/pipe/softpipe/sp_state.h | 7 | ||||
-rw-r--r-- | src/mesa/pipe/softpipe/sp_state_fs.c | 12 |
8 files changed, 105 insertions, 5 deletions
diff --git a/src/mesa/pipe/Makefile.template b/src/mesa/pipe/Makefile.template index 495bf44c07..8c2f84b328 100644 --- a/src/mesa/pipe/Makefile.template +++ b/src/mesa/pipe/Makefile.template @@ -22,7 +22,7 @@ INCLUDES = \ ##### RULES ##### .c.o: - $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ + $(CC) -c $(INCLUDES) $(LLVM_CFLAGS) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ .S.o: $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ diff --git a/src/mesa/pipe/draw/draw_vertex_shader.c b/src/mesa/pipe/draw/draw_vertex_shader.c index 056ad007cf..7768a62000 100644 --- a/src/mesa/pipe/draw/draw_vertex_shader.c +++ b/src/mesa/pipe/draw/draw_vertex_shader.c @@ -39,7 +39,7 @@ #include "x86/rtasm/x86sse.h" #include "pipe/tgsi/exec/tgsi_core.h" -#include "pipe/llvm/llvmtgsi.h" +#include "pipe/llvm/gallivm.h" #define DBG_VS 0 @@ -240,8 +240,10 @@ draw_create_vertex_shader(struct draw_context *draw, #endif #ifdef MESA_LLVM vs->llvm_prog = gallivm_from_tgsi(shader->tokens); - if (!draw->engine) + draw->engine = gallivm_global_cpu_engine(); + if (!draw->engine) { draw->engine = gallivm_cpu_engine_create(vs->llvm_prog); + } else gallivm_cpu_jit_compile(draw->engine, vs->llvm_prog); #endif diff --git a/src/mesa/pipe/draw/draw_vertex_shader_llvm.c b/src/mesa/pipe/draw/draw_vertex_shader_llvm.c index b340ab38fd..c42e9bbd69 100644 --- a/src/mesa/pipe/draw/draw_vertex_shader_llvm.c +++ b/src/mesa/pipe/draw/draw_vertex_shader_llvm.c @@ -37,7 +37,7 @@ #ifdef MESA_LLVM -#include "pipe/llvm/llvmtgsi.h" +#include "pipe/llvm/gallivm.h" #include "pipe/tgsi/exec/tgsi_core.h" #define DBG 0 diff --git a/src/mesa/pipe/llvm/llvmtgsi.cpp b/src/mesa/pipe/llvm/gallivm.cpp index c787f3ab9f..b09a2ff8ee 100644 --- a/src/mesa/pipe/llvm/llvmtgsi.cpp +++ b/src/mesa/pipe/llvm/gallivm.cpp @@ -31,7 +31,7 @@ */ #ifdef MESA_LLVM -#include "llvmtgsi.h" +#include "gallivm.h" #include "instructions.h" #include "storage.h" @@ -828,6 +828,7 @@ void gallivm_prog_dump(struct gallivm_prog *prog, const char *file_prefix) } +static struct gallivm_cpu_engine *CPU = 0; /*! This function creates a CPU based execution engine for the given gallivm_prog. gallivm_cpu_engine should be used as a singleton throughout the library. Before @@ -847,6 +848,7 @@ struct gallivm_cpu_engine * gallivm_cpu_engine_create(struct gallivm_prog *prog) llvm::Function *func = mod->getFunction("run_vertex_shader"); prog->function = ee->getPointerToFunctionOrStub(func); + CPU = cpu; return cpu; } @@ -874,6 +876,12 @@ void gallivm_cpu_engine_delete(struct gallivm_cpu_engine *cpu) free(cpu); } +struct gallivm_cpu_engine * gallivm_global_cpu_engine() +{ + return CPU; +} + #endif /* MESA_LLVM */ + diff --git a/src/mesa/pipe/llvm/llvmtgsi.h b/src/mesa/pipe/llvm/gallivm.h index dadc0ea455..b4e98c881b 100644 --- a/src/mesa/pipe/llvm/llvmtgsi.h +++ b/src/mesa/pipe/llvm/gallivm.h @@ -59,6 +59,7 @@ void gallivm_prog_dump(struct gallivm_prog *prog, const char *file_prefix); struct gallivm_cpu_engine *gallivm_cpu_engine_create(struct gallivm_prog *prog); +struct gallivm_cpu_engine *gallivm_global_cpu_engine(); void gallivm_cpu_jit_compile(struct gallivm_cpu_engine *ee, struct gallivm_prog *prog); void gallivm_cpu_engine_delete(struct gallivm_cpu_engine *ee); diff --git a/src/mesa/pipe/softpipe/sp_quad_fs.c b/src/mesa/pipe/softpipe/sp_quad_fs.c index d6d7eb6489..4bc604d682 100644 --- a/src/mesa/pipe/softpipe/sp_quad_fs.c +++ b/src/mesa/pipe/softpipe/sp_quad_fs.c @@ -156,6 +156,76 @@ shade_quad( } } +#if 0 +static void +shade_quad_llvm(struct quad_stage *qs, + struct quad_header *quad) +{ + struct quad_shade_stage *qss = quad_shade_stage(qs); + struct softpipe_context *softpipe = qs->softpipe; + const float fx = (float) quad->x0; + const float fy = (float) quad->y0; + + /* Consts does not require 16 byte alignment. */ + machine->Consts = softpipe->mapped_constants[PIPE_SHADER_FRAGMENT]; + + machine->SamplerUnits = softpipe->sampler_units; + machine->InterpCoefs = quad->coef; + + machine->Inputs[0].xyzw[0].f[0] = fx; + machine->Inputs[0].xyzw[0].f[1] = fx + 1.0f; + machine->Inputs[0].xyzw[0].f[2] = fx; + machine->Inputs[0].xyzw[0].f[3] = fx + 1.0f; + + machine->Inputs[0].xyzw[1].f[0] = fy; + machine->Inputs[0].xyzw[1].f[1] = fy; + machine->Inputs[0].xyzw[1].f[2] = fy + 1.0f; + machine->Inputs[0].xyzw[1].f[3] = fy + 1.0f; + + /* run shader */ +#if defined(__i386__) || defined(__386__) + machine->Inputs, + machine->Outputs, + machine->Consts, + machine->Temps, + machine->InterpCoefs ); + quad->mask &= ~(machine->Temps[TGSI_EXEC_TEMP_KILMASK_I].xyzw[TGSI_EXEC_TEMP_KILMASK_C].u[0]); +#endif + ga_llvm_prog_exec(softpipe->fs->llvm_prog); + + /* store result color */ + if (qss->colorOutSlot >= 0) { + /* XXX need to handle multiple color outputs someday */ + assert(qss->stage.softpipe->fs->shader.output_semantic_name[qss->colorOutSlot] + == TGSI_SEMANTIC_COLOR); + memcpy( + quad->outputs.color, + &machine->Outputs[qss->colorOutSlot].xyzw[0].f[0], + sizeof( quad->outputs.color ) ); + } + + /* store result Z */ + if (qss->depthOutSlot >= 0) { + /* output[slot] is new Z */ + uint i; + for (i = 0; i < 4; i++) { + quad->outputs.depth[i] = machine->Outputs[0].xyzw[2].f[i]; + } + } + else { + /* copy input Z (which was interpolated by the executor) to output Z */ + uint i; + for (i = 0; i < 4; i++) { + quad->outputs.depth[i] = machine->Inputs[0].xyzw[2].f[i]; + } + } + + /* shader may cull fragments */ + if( quad->mask ) { + qs->next->run( qs->next, quad ); + } +} +#endif /** * Per-primitive (or per-begin?) setup diff --git a/src/mesa/pipe/softpipe/sp_state.h b/src/mesa/pipe/softpipe/sp_state.h index 676ad06bfc..2f096a9cc9 100644 --- a/src/mesa/pipe/softpipe/sp_state.h +++ b/src/mesa/pipe/softpipe/sp_state.h @@ -35,6 +35,10 @@ #include "x86/rtasm/x86sse.h" +#ifdef MESA_LLVM +struct gallivm_prog; +#endif + /** * Softpipe fs state is derived from pipe_shader_state. */ @@ -43,6 +47,9 @@ struct sp_fragment_shader_state { #if defined(__i386__) || defined(__386__) struct x86_function sse2_program; #endif +#ifdef MESA_LLVM + struct gallivm_prog *llvm_prog; +#endif }; void * diff --git a/src/mesa/pipe/softpipe/sp_state_fs.c b/src/mesa/pipe/softpipe/sp_state_fs.c index 351c2954f5..92b775ae51 100644 --- a/src/mesa/pipe/softpipe/sp_state_fs.c +++ b/src/mesa/pipe/softpipe/sp_state_fs.c @@ -33,6 +33,7 @@ #include "pipe/p_winsys.h" #include "pipe/draw/draw_context.h" #include "pipe/tgsi/exec/tgsi_core.h" +#include "pipe/llvm/gallivm.h" void * softpipe_create_fs_state(struct pipe_context *pipe, @@ -60,6 +61,17 @@ void * softpipe_create_fs_state(struct pipe_context *pipe, } #endif +#ifdef MESA_LLVM + fprintf(stderr, "+++++++++++++++++++++++++++++++++++++++++++++++++\n"); + state->llvm_prog = gallivm_from_tgsi(state->shader.tokens); + if (!gallivm_global_cpu_engine()) { + gallivm_cpu_engine_create(state->llvm_prog); + } + else + gallivm_cpu_jit_compile(gallivm_global_cpu_engine(), state->llvm_prog); + fprintf(stderr, "+++++++++++++++++++++++++++++++++++++++++++++++++\n"); +#endif + return state; } |