Merge commit 'origin/gallium-0.1' into gallium-0.1
authorKeith Whitwell <keith@tungstengraphics.com>
Fri, 15 Feb 2008 11:15:47 +0000 (11:15 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Fri, 15 Feb 2008 11:15:47 +0000 (11:15 +0000)
Conflicts:

src/gallium/drivers/softpipe/sp_quad_fs.c
src/gallium/drivers/softpipe/sp_state.h
src/gallium/drivers/softpipe/sp_state_fs.c

14 files changed:
1  2 
src/gallium/aux/draw/draw_vertex_shader.c
src/gallium/aux/tgsi/exec/tgsi_exec.c
src/gallium/aux/tgsi/exec/tgsi_exec.h
src/gallium/aux/tgsi/exec/tgsi_sse2.c
src/gallium/drivers/softpipe/Makefile
src/gallium/drivers/softpipe/sp_context.h
src/gallium/drivers/softpipe/sp_fs.h
src/gallium/drivers/softpipe/sp_fs_exec.c
src/gallium/drivers/softpipe/sp_fs_llvm.c
src/gallium/drivers/softpipe/sp_fs_sse.c
src/gallium/drivers/softpipe/sp_quad_fs.c
src/gallium/drivers/softpipe/sp_state.h
src/gallium/drivers/softpipe/sp_state_fs.c
src/gallium/include/pipe/p_state.h

Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,0000000..4792ace
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,54 @@@
++/**************************************************************************
++ * 
++ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
++ * All Rights Reserved.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the
++ * "Software"), to deal in the Software without restriction, including
++ * without limitation the rights to use, copy, modify, merge, publish,
++ * distribute, sub license, and/or sell copies of the Software, and to
++ * permit persons to whom the Software is furnished to do so, subject to
++ * the following conditions:
++ * 
++ * The above copyright notice and this permission notice (including the
++ * next paragraph) shall be included in all copies or substantial portions
++ * of the Software.
++ * 
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
++ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
++ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
++ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
++ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++ * 
++ **************************************************************************/
++
++/* Authors:  Keith Whitwell <keith@tungstengraphics.com>
++ */
++
++#ifndef SP_FS_H
++#define SP_FS_H
++
++struct sp_fragment_shader *
++softpipe_create_fs_exec(struct softpipe_context *softpipe,
++                     const struct pipe_shader_state *templ);
++
++struct sp_fragment_shader *
++softpipe_create_fs_sse(struct softpipe_context *softpipe,
++                     const struct pipe_shader_state *templ);
++
++struct sp_fragment_shader *
++softpipe_create_fs_llvm(struct softpipe_context *softpipe,
++                      const struct pipe_shader_state *templ);
++
++struct tgsi_interp_coef;
++struct tgsi_exec_vector;
++
++void sp_setup_pos_vector(const struct tgsi_interp_coef *coef,
++                       float x, float y,
++                       struct tgsi_exec_vector *quadpos);
++
++
++#endif
index b949492,0000000..9ad30a7
mode 100644,000000..100644
--- /dev/null
@@@ -1,112 -1,0 +1,112 @@@
- #include "pipe/tgsi/exec/tgsi_exec.h"
 +/**************************************************************************
 + * 
 + * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
 + * All Rights Reserved.
 + * 
 + * Permission is hereby granted, free of charge, to any person obtaining a
 + * copy of this software and associated documentation files (the
 + * "Software"), to deal in the Software without restriction, including
 + * without limitation the rights to use, copy, modify, merge, publish,
 + * distribute, sub license, and/or sell copies of the Software, and to
 + * permit persons to whom the Software is furnished to do so, subject to
 + * the following conditions:
 + * 
 + * The above copyright notice and this permission notice (including the
 + * next paragraph) shall be included in all copies or substantial portions
 + * of the Software.
 + * 
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
 + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 + * 
 + **************************************************************************/
 +
 +
 +#include "sp_context.h"
 +#include "sp_state.h"
 +#include "sp_fs.h"
 +#include "sp_headers.h"
 +
 +
 +#include "pipe/p_state.h"
 +#include "pipe/p_defines.h"
 +#include "pipe/p_util.h"
 +#include "pipe/p_inlines.h"
++#include "tgsi/exec/tgsi_exec.h"
 +
 +struct sp_exec_fragment_shader {
 +   struct sp_fragment_shader base;
 +};
 +
 +
 +
 +
 +static void
 +exec_prepare( struct sp_fragment_shader *base,
 +            struct tgsi_exec_machine *machine,
 +            struct tgsi_sampler *samplers )
 +{
 +   tgsi_exec_machine_bind_shader( machine,
 +                                base->shader.tokens,
 +                                PIPE_MAX_SAMPLERS,
 +                                samplers );
 +}
 +
 +
 +
 +
 +/* TODO: hide the machine struct in here somewhere, remove from this
 + * interface:
 + */
 +static unsigned 
 +exec_run( struct sp_fragment_shader *base,
 +        struct tgsi_exec_machine *machine,
 +        struct quad_header *quad )
 +{
 +
 +   /* Compute X, Y, Z, W vals for this quad */
 +   sp_setup_pos_vector(quad->posCoef, 
 +                     (float)quad->x0, (float)quad->y0, 
 +                     &machine->QuadPos);
 +   
 +   return tgsi_exec_machine_run( machine );
 +}
 +
 +
 +
 +static void 
 +exec_delete( struct sp_fragment_shader *base )
 +{
 +   FREE(base);
 +}
 +
 +
 +
 +
 +
 +struct sp_fragment_shader *
 +softpipe_create_fs_exec(struct softpipe_context *softpipe,
 +                      const struct pipe_shader_state *templ)
 +{
 +   struct sp_exec_fragment_shader *shader;
 +
 +   /* Decide whether we'll be codegenerating this shader and if so do
 +    * that now.
 +    */
 +
 +   shader = CALLOC_STRUCT(sp_exec_fragment_shader);
 +   if (!shader)
 +      return NULL;
 +
 +   shader->base.shader = *templ;
 +   shader->base.prepare = exec_prepare;
 +   shader->base.run = exec_run;
 +   shader->base.delete = exec_delete;
 +
 +   return &shader->base;
 +}
 +
index 9237c1f,0000000..22da471
mode 100644,000000..100644
--- /dev/null
@@@ -1,200 -1,0 +1,200 @@@
- #include "pipe/tgsi/exec/tgsi_sse2.h"
 +/**************************************************************************
 + * 
 + * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
 + * All Rights Reserved.
 + * 
 + * Permission is hereby granted, free of charge, to any person obtaining a
 + * copy of this software and associated documentation files (the
 + * "Software"), to deal in the Software without restriction, including
 + * without limitation the rights to use, copy, modify, merge, publish,
 + * distribute, sub license, and/or sell copies of the Software, and to
 + * permit persons to whom the Software is furnished to do so, subject to
 + * the following conditions:
 + * 
 + * The above copyright notice and this permission notice (including the
 + * next paragraph) shall be included in all copies or substantial portions
 + * of the Software.
 + * 
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
 + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 + * 
 + **************************************************************************/
 +
 +/* Authors:
 + *   Zack Rusin
 + */
 +
 +#include "sp_context.h"
 +#include "sp_state.h"
 +#include "sp_fs.h"
 +
 +
 +#include "pipe/p_state.h"
 +#include "pipe/p_defines.h"
 +#include "pipe/p_util.h"
 +#include "pipe/p_inlines.h"
++#include "tgsi/exec/tgsi_sse2.h"
 +
 +#if 0
 +
 +struct sp_llvm_fragment_shader {
 +   struct sp_fragment_shader base;
 +   struct gallivm_prog *llvm_prog;
 +};
 +
 +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;
 +   float dests[4][16][4] ALIGN16_ATTRIB;
 +   float inputs[4][16][4] ALIGN16_ATTRIB;
 +   const float fx = (float) quad->x0;
 +   const float fy = (float) quad->y0;
 +   struct gallivm_prog *llvm = qss->llvm_prog;
 +
 +   inputs[0][0][0] = fx;
 +   inputs[1][0][0] = fx + 1.0f;
 +   inputs[2][0][0] = fx;
 +   inputs[3][0][0] = fx + 1.0f;
 +
 +   inputs[0][0][1] = fy;
 +   inputs[1][0][1] = fy;
 +   inputs[2][0][1] = fy + 1.0f;
 +   inputs[3][0][1] = fy + 1.0f;
 +
 +
 +   gallivm_prog_inputs_interpolate(llvm, inputs, quad->coef);
 +
 +#if DLLVM
 +   debug_printf("MASK = %d\n", quad->mask);
 +   for (int i = 0; i < 4; ++i) {
 +      for (int j = 0; j < 2; ++j) {
 +         debug_printf("IN(%d,%d) [%f %f %f %f]\n", i, j, 
 +                inputs[i][j][0], inputs[i][j][1], inputs[i][j][2], inputs[i][j][3]);
 +      }
 +   }
 +#endif
 +
 +   quad->mask &=
 +      gallivm_fragment_shader_exec(llvm, fx, fy, dests, inputs,
 +                                   softpipe->mapped_constants[PIPE_SHADER_FRAGMENT],
 +                                   qss->samplers);
 +#if DLLVM
 +   debug_printf("OUT LLVM = 1[%f %f %f %f], 2[%f %f %f %f]\n",
 +          dests[0][0][0], dests[0][0][1], dests[0][0][2], dests[0][0][3], 
 +          dests[0][1][0], dests[0][1][1], dests[0][1][2], dests[0][1][3]);
 +#endif
 +
 +   /* store result color */
 +   if (qss->colorOutSlot >= 0) {
 +      unsigned i;
 +      /* XXX need to handle multiple color outputs someday */
 +      allvmrt(qss->stage.softpipe->fs->shader.output_semantic_name[qss->colorOutSlot]
 +             == TGSI_SEMANTIC_COLOR);
 +      for (i = 0; i < QUAD_SIZE; ++i) {
 +         quad->outputs.color[0][i] = dests[i][qss->colorOutSlot][0];
 +         quad->outputs.color[1][i] = dests[i][qss->colorOutSlot][1];
 +         quad->outputs.color[2][i] = dests[i][qss->colorOutSlot][2];
 +         quad->outputs.color[3][i] = dests[i][qss->colorOutSlot][3];
 +      }
 +   }
 +#if DLLVM
 +   for (int i = 0; i < QUAD_SIZE; ++i) {
 +      debug_printf("QLLVM%d(%d) [%f, %f, %f, %f]\n", i, qss->colorOutSlot,
 +             quad->outputs.color[0][i],
 +             quad->outputs.color[1][i],
 +             quad->outputs.color[2][i],
 +             quad->outputs.color[3][i]);
 +   }
 +#endif
 +
 +   /* store result Z */
 +   if (qss->depthOutSlot >= 0) {
 +      /* output[slot] is new Z */
 +      uint i;
 +      for (i = 0; i < 4; i++) {
 +         quad->outputs.depth[i] = dests[i][0][2];
 +      }
 +   }
 +   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] = inputs[i][0][2];
 +      }
 +   }
 +#if DLLVM
 +   debug_printf("D [%f, %f, %f, %f] mask = %d\n",
 +             quad->outputs.depth[0],
 +             quad->outputs.depth[1],
 +             quad->outputs.depth[2],
 +             quad->outputs.depth[3], quad->mask);
 +#endif
 +
 +   /* shader may cull fragments */
 +   if( quad->mask ) {
 +      qs->next->run( qs->next, quad );
 +   }
 +}
 +
 +
 +unsigned 
 +run_llvm_fs( struct sp_fragment_shader *base,
 +           struct foo *machine )
 +{
 +}
 +
 +
 +void 
 +delete_llvm_fs( struct sp_fragment_shader *base )
 +{
 +   FREE(base);
 +}
 +
 +
 +struct sp_fragment_shader *
 +softpipe_create_fs_llvm(struct softpipe_context *softpipe,
 +                     const struct pipe_shader_state *templ)
 +{
 +   struct sp_llvm_fragment_shader *shader = NULL;
 +
 +   /* LLVM fragment shaders currently disabled:
 +    */
 +   state = CALLOC_STRUCT(sp_llvm_shader_state);
 +   if (!state)
 +      return NULL;
 +
 +   state->llvm_prog = 0;
 +
 +   if (!gallivm_global_cpu_engine()) {
 +      gallivm_cpu_engine_create(state->llvm_prog);
 +   }
 +   else
 +      gallivm_cpu_jit_compile(gallivm_global_cpu_engine(), state->llvm_prog);
 +   
 +   if (shader) {
 +      shader->base.run = run_llvm_fs;
 +      shader->base.delete = delete_llvm_fs;
 +   }
 +
 +   return shader;
 +}
 +
 +
 +#else
 +
 +struct sp_fragment_shader *
 +softpipe_create_fs_llvm(struct softpipe_context *softpipe,
 +                     const struct pipe_shader_state *templ)
 +{
 +   return NULL;
 +}
 +
 +#endif
index 713ece3,0000000..28c5d8c
mode 100644,000000..100644
--- /dev/null
@@@ -1,192 -1,0 +1,192 @@@
- #include "pipe/tgsi/exec/tgsi_exec.h"
- #include "pipe/tgsi/exec/tgsi_sse2.h"
 +/**************************************************************************
 + * 
 + * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
 + * All Rights Reserved.
 + * 
 + * Permission is hereby granted, free of charge, to any person obtaining a
 + * copy of this software and associated documentation files (the
 + * "Software"), to deal in the Software without restriction, including
 + * without limitation the rights to use, copy, modify, merge, publish,
 + * distribute, sub license, and/or sell copies of the Software, and to
 + * permit persons to whom the Software is furnished to do so, subject to
 + * the following conditions:
 + * 
 + * The above copyright notice and this permission notice (including the
 + * next paragraph) shall be included in all copies or substantial portions
 + * of the Software.
 + * 
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
 + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 + * 
 + **************************************************************************/
 +
 +
 +#include "sp_context.h"
 +#include "sp_state.h"
 +#include "sp_fs.h"
 +#include "sp_headers.h"
 +
 +
 +#include "pipe/p_state.h"
 +#include "pipe/p_defines.h"
 +#include "pipe/p_util.h"
 +#include "pipe/p_inlines.h"
++#include "tgsi/exec/tgsi_exec.h"
++#include "tgsi/exec/tgsi_sse2.h"
 +
 +
 +#if defined(__i386__) || defined(__386__)
 +
 +#include "x86/rtasm/x86sse.h"
 +
 +/* Surely this should be defined somewhere in a tgsi header:
 + */
 +typedef void (XSTDCALL *codegen_function)(
 +   const struct tgsi_exec_vector *input,
 +   struct tgsi_exec_vector *output,
 +   float (*constant)[4],
 +   struct tgsi_exec_vector *temporary,
 +   const struct tgsi_interp_coef *coef
 +   //, const struct tgsi_exec_vector *quadPos
 + );
 +
 +
 +struct sp_sse_fragment_shader {
 +   struct sp_fragment_shader base;
 +   struct x86_function             sse2_program;
 +   codegen_function func;
 +};
 +
 +
 +/**
 + * Compute quad X,Y,Z,W for the four fragments in a quad.
 + *
 + * This should really be part of the compiled shader.
 + */
 +void
 +sp_setup_pos_vector(const struct tgsi_interp_coef *coef,
 +                  float x, float y,
 +                  struct tgsi_exec_vector *quadpos)
 +{
 +   uint chan;
 +   /* do X */
 +   quadpos->xyzw[0].f[0] = x;
 +   quadpos->xyzw[0].f[1] = x + 1;
 +   quadpos->xyzw[0].f[2] = x;
 +   quadpos->xyzw[0].f[3] = x + 1;
 +
 +   /* do Y */
 +   quadpos->xyzw[1].f[0] = y;
 +   quadpos->xyzw[1].f[1] = y;
 +   quadpos->xyzw[1].f[2] = y + 1;
 +   quadpos->xyzw[1].f[3] = y + 1;
 +
 +   /* do Z and W for all fragments in the quad */
 +   for (chan = 2; chan < 4; chan++) {
 +      const float dadx = coef->dadx[chan];
 +      const float dady = coef->dady[chan];
 +      const float a0 = coef->a0[chan] + dadx * x + dady * y;
 +      quadpos->xyzw[chan].f[0] = a0;
 +      quadpos->xyzw[chan].f[1] = a0 + dadx;
 +      quadpos->xyzw[chan].f[2] = a0 + dady;
 +      quadpos->xyzw[chan].f[3] = a0 + dadx + dady;
 +   }
 +}
 +
 +
 +static void
 +sse_prepare( struct sp_fragment_shader *base,
 +            struct tgsi_exec_machine *machine,
 +            struct tgsi_sampler *samplers )
 +{
 +}
 +
 +
 +/* TODO: codegenerate the whole run function, skip this wrapper.
 + * TODO: break dependency on tgsi_exec_machine struct
 + * TODO: push Position calculation into the generated shader
 + * TODO: process >1 quad at a time
 + */
 +static unsigned 
 +sse_run( struct sp_fragment_shader *base,
 +       struct tgsi_exec_machine *machine,
 +       struct quad_header *quad )
 +{
 +   struct sp_sse_fragment_shader *shader = (struct sp_sse_fragment_shader *) base;
 +
 +   /* Compute X, Y, Z, W vals for this quad -- place in temp[0] for now */
 +   sp_setup_pos_vector(quad->posCoef, 
 +                     (float)quad->x0, (float)quad->y0, 
 +                     machine->Temps);
 +
 +   shader->func( machine->Inputs,
 +               machine->Outputs,
 +               machine->Consts,
 +               machine->Temps,
 +               machine->InterpCoefs
 +               //      , &machine->QuadPos
 +      );
 +
 +   return ~(machine->Temps[TGSI_EXEC_TEMP_KILMASK_I].xyzw[TGSI_EXEC_TEMP_KILMASK_C].u[0]);
 +}
 +
 +
 +static void 
 +sse_delete( struct sp_fragment_shader *base )
 +{
 +   struct sp_sse_fragment_shader *shader = (struct sp_sse_fragment_shader *) base;
 +
 +   x86_release_func( &shader->sse2_program );
 +   FREE(shader);
 +}
 +
 +
 +struct sp_fragment_shader *
 +softpipe_create_fs_sse(struct softpipe_context *softpipe,
 +                     const struct pipe_shader_state *templ)
 +{
 +   struct sp_sse_fragment_shader *shader;
 +
 +   if (!softpipe->use_sse)
 +      return NULL;
 +
 +   shader = CALLOC_STRUCT(sp_sse_fragment_shader);
 +   if (!shader)
 +      return NULL;
 +
 +   x86_init_func( &shader->sse2_program );
 +   
 +   if (!tgsi_emit_sse2_fs( templ->tokens, &shader->sse2_program )) {
 +      FREE(shader);
 +      return NULL;
 +   }
 +
 +   shader->func = (codegen_function) x86_get_func( &shader->sse2_program );
 +   assert(shader->func);
 +
 +   shader->base.shader = *templ;
 +   shader->base.prepare = sse_prepare;
 +   shader->base.run = sse_run;
 +   shader->base.delete = sse_delete;
 +
 +   return &shader->base;
 +}
 +
 +
 +#else
 +
 +/* Maybe put this varient in the header file.
 + */
 +struct sp_fragment_shader *
 +softpipe_create_fs_sse(struct softpipe_context *softpipe,
 +                     const struct pipe_shader_state *templ)
 +{
 +   return NULL;
 +}
 +
 +#endif
  #define SP_NEW_QUERY         0x4000
  
  
 +struct tgsi_sampler;
 +struct tgsi_interp_coef;
 +struct tgsi_exec_machine;
  
 -#ifdef MESA_LLVM
 -struct gallivm_prog;
 -#endif
  
 +/** Subclass of pipe_shader_state (though it doesn't really need to be).
 + *
 + * This is starting to look an awful lot like a quad pipeline stage...
 + */
 +struct sp_fragment_shader {
 +   struct pipe_shader_state   shader;
  
 -struct vertex_info;
 +   void (*prepare)( struct sp_fragment_shader *shader,
 +                  struct tgsi_exec_machine *machine,
 +                  struct tgsi_sampler *samplers);
  
 +   /* Run the shader - this interface will get cleaned up in the
 +    * future:
 +    */
 +   unsigned (*run)( struct sp_fragment_shader *shader,
 +                  struct tgsi_exec_machine *machine,
 +                  struct quad_header *quad );
  
 -/** Subclass of pipe_shader_state */
 -struct sp_fragment_shader_state {
 -   struct pipe_shader_state   shader;
 -#if defined(__i386__) || defined(__386__)
 -   struct x86_function        sse2_program;
 -#endif
 -#ifdef MESA_LLVM
 -   struct gallivm_prog *llvm_prog;
 -#endif
 +
 +   void (*delete)( struct sp_fragment_shader * );
  };
  
++struct vertex_info;
  
  /** Subclass of pipe_shader_state */
 -struct sp_vertex_shader_state {
 +struct sp_vertex_shader {
     struct pipe_shader_state shader;
     struct draw_vertex_shader *draw_data;
  };
  #include "pipe/p_util.h"
  #include "pipe/p_inlines.h"
  #include "pipe/p_winsys.h"
 -#include "draw/draw_context.h"
  #include "pipe/p_shader_tokens.h"
- #include "pipe/draw/draw_context.h"
- #include "pipe/tgsi/util/tgsi_dump.h"
 -#include "llvm/gallivm.h"
++#include "draw/draw_context.h"
+ #include "tgsi/util/tgsi_dump.h"
 -#include "tgsi/exec/tgsi_sse2.h"
  
  
  void *
Simple merge