diff options
| -rw-r--r-- | src/mesa/pipe/draw/draw_prim.c | 31 | ||||
| -rw-r--r-- | src/mesa/pipe/p_state.h | 1 | ||||
| -rw-r--r-- | src/mesa/pipe/tgsi/exec/tgsi_exec.c | 29 | ||||
| -rw-r--r-- | src/mesa/pipe/tgsi/exec/tgsi_exec.h | 7 | ||||
| -rwxr-xr-x | src/mesa/pipe/tgsi/exec/tgsi_sse2.c | 4 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_atom_vs.c | 12 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_program.c | 14 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_program.h | 6 | 
8 files changed, 65 insertions, 39 deletions
diff --git a/src/mesa/pipe/draw/draw_prim.c b/src/mesa/pipe/draw/draw_prim.c index 2d613754e8..09616cf315 100644 --- a/src/mesa/pipe/draw/draw_prim.c +++ b/src/mesa/pipe/draw/draw_prim.c @@ -113,6 +113,21 @@ fetch_attrib4(const void *ptr, unsigned format, float attrib[4])     }  } +#if !defined(XSTDCALL)  +#if defined(WIN32) +#define XSTDCALL __stdcall +#else +#define XSTDCALL +#endif +#endif + +#if defined(USE_X86_ASM) || defined(SLANG_X86) +typedef void (XSTDCALL *sse2_function)( +   const struct tgsi_exec_vector *input, +   struct tgsi_exec_vector *output, +   float (*constant)[4], +   struct tgsi_exec_vector *temporary ); +#endif  /**   * Transform vertices with the current vertex program/shader @@ -224,7 +239,21 @@ run_vertex_program(struct draw_context *draw,  #endif     /* run shader */ -   tgsi_exec_machine_run( &machine ); +   if( draw->vertex_shader.executable != NULL ) { +#if defined(USE_X86_ASM) || defined(SLANG_X86) +      sse2_function func = (sse2_function) draw->vertex_shader.executable; +      func( +         machine.Inputs, +         machine.Outputs, +         machine.Consts, +         machine.Temps ); +#else +      assert( 0 ); +#endif +   } +   else { +      tgsi_exec_machine_run( &machine ); +   }  #if 0     for (i = 0; i < 4; i++) { diff --git a/src/mesa/pipe/p_state.h b/src/mesa/pipe/p_state.h index e562a8d058..25e5861e1e 100644 --- a/src/mesa/pipe/p_state.h +++ b/src/mesa/pipe/p_state.h @@ -128,6 +128,7 @@ struct pipe_shader_state {     unsigned inputs_read;                   /**< TGSI_ATTRIB_ bits */     unsigned outputs_written;               /**< TGSI_ATTRIB_ bits */     const struct tgsi_token *tokens; +   void *executable;  };  struct pipe_depth_state diff --git a/src/mesa/pipe/tgsi/exec/tgsi_exec.c b/src/mesa/pipe/tgsi/exec/tgsi_exec.c index a1f46712b4..793f8bc0f6 100644 --- a/src/mesa/pipe/tgsi/exec/tgsi_exec.c +++ b/src/mesa/pipe/tgsi/exec/tgsi_exec.c @@ -85,11 +85,6 @@ tgsi_exec_machine_init(     mach->Temps = (struct tgsi_exec_vector *) tgsi_align_128bit( mach->_Temps);     mach->Addrs = &mach->Temps[TGSI_EXEC_NUM_TEMPS]; -#if XXX_SSE -    tgsi_emit_sse (tokens, -                   &mach->Function); -#endif -     /* Setup constants. */     for( i = 0; i < 4; i++ ) {        mach->Temps[TEMP_0_I].xyzw[TEMP_0_C].u[i] = 0x00000000; @@ -967,6 +962,7 @@ store_dest(     default:        assert( 0 ); +      return;     }     switch (inst->Instruction.Saturate) @@ -2226,20 +2222,6 @@ exec_instruction(     }  } - -#if !defined(XSTDCALL)  -#if defined(WIN32) -#define XSTDCALL __stdcall -#else -#define XSTDCALL -#endif -#endif - -typedef void (XSTDCALL *fp_function) (const struct tgsi_exec_vector *input, -				     struct tgsi_exec_vector *output, -				     GLfloat (*constant)[4], -				     struct tgsi_exec_vector *temporary); -  void  tgsi_exec_machine_run2(     struct tgsi_exec_machine *mach, @@ -2251,16 +2233,7 @@ tgsi_exec_machine_run2(  #endif  #if XXX_SSE -   fp_function function; -     mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] = 0; -     -   function = (fp_function) x86_get_func (&mach->Function); - -   function (mach->Inputs, -             mach->Outputs, -             mach->Consts, -             mach->Temps);  #else     struct tgsi_parse_context parse;     GLuint k; diff --git a/src/mesa/pipe/tgsi/exec/tgsi_exec.h b/src/mesa/pipe/tgsi/exec/tgsi_exec.h index e5e8c3608e..d50f786029 100644 --- a/src/mesa/pipe/tgsi/exec/tgsi_exec.h +++ b/src/mesa/pipe/tgsi/exec/tgsi_exec.h @@ -3,10 +3,6 @@  #include "pipe/p_compiler.h" -#if 0 -#include "x86/rtasm/x86sse.h" -#endif -  #if defined __cplusplus  extern "C" {  #endif // defined __cplusplus @@ -157,9 +153,6 @@ struct tgsi_exec_machine     const struct tgsi_interp_coef *InterpCoefs;     struct tgsi_exec_cond_stack   CondStack; -#if XXX_SSE -   struct x86_function           Function; -#endif  };  void diff --git a/src/mesa/pipe/tgsi/exec/tgsi_sse2.c b/src/mesa/pipe/tgsi/exec/tgsi_sse2.c index 359775fdfb..d89bb19970 100755 --- a/src/mesa/pipe/tgsi/exec/tgsi_sse2.c +++ b/src/mesa/pipe/tgsi/exec/tgsi_sse2.c @@ -1659,13 +1659,13 @@ emit_instruction(  }  unsigned -tgsi_emit_sse( +tgsi_emit_sse2(     struct tgsi_token *tokens,     struct x86_function *func )  {     struct tgsi_parse_context parse; -   x86_init_func( func ); +   func->csr = func->store;     x86_mov(        func, diff --git a/src/mesa/state_tracker/st_atom_vs.c b/src/mesa/state_tracker/st_atom_vs.c index 7420a49520..a326c12608 100644 --- a/src/mesa/state_tracker/st_atom_vs.c +++ b/src/mesa/state_tracker/st_atom_vs.c @@ -38,7 +38,7 @@  #include "pipe/p_defines.h"  #include "pipe/p_winsys.h"  #include "pipe/tgsi/mesa/mesa_to_tgsi.h" -#include "pipe/tgsi/exec/tgsi_dump.h" +#include "pipe/tgsi/exec/tgsi_core.h"  #include "st_context.h"  #include "st_atom.h" @@ -56,6 +56,12 @@ static void compile_vs( struct st_context *st,     if (TGSI_DEBUG)        tgsi_dump( vs->tokens, TGSI_DUMP_VERBOSE ); + +#if defined(USE_X86_ASM) || defined(SLANG_X86) +   tgsi_emit_sse2( +      vs->tokens, +      &vs->sse2_program ); +#endif  } @@ -121,6 +127,10 @@ static void update_vs( struct st_context *st )        = tgsi_mesa_translate_vertex_output_mask(vp->Base.Base.OutputsWritten);     vs.tokens = &vp->tokens[0]; +#if defined(USE_X86_ASM) || defined(SLANG_X86) +   vs.executable = (void *) x86_get_func( &vp->sse2_program ); +#endif +     if (memcmp(&vs, &st->state.vs, sizeof(vs)) != 0 ||         vp->dirty)      { diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c index d0344efa0c..25da720d86 100644 --- a/src/mesa/state_tracker/st_cb_program.c +++ b/src/mesa/state_tracker/st_cb_program.c @@ -77,6 +77,10 @@ static struct gl_program *st_new_program( GLcontext *ctx,        prog->id = program_id++;        prog->dirty = 1; +#if defined(USE_X86_ASM) || defined(SLANG_X86) +      x86_init_func( &prog->sse2_program ); +#endif +        return _mesa_init_vertex_program( ctx,   					&prog->Base,  					target,  @@ -105,6 +109,16 @@ static struct gl_program *st_new_program( GLcontext *ctx,  static void st_delete_program( GLcontext *ctx,  			       struct gl_program *prog )  { +   switch( prog->Target ) { +   case GL_VERTEX_PROGRAM_ARB: +   { +      struct st_vertex_program *p = (struct st_vertex_program *) prog; + +      x86_release_func( &p->sse2_program ); +      break; +   } + +   }     _mesa_delete_program( ctx, prog );  } diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index e7eb7a8e3f..883953399c 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -36,6 +36,7 @@  #include "mtypes.h"  #include "pipe/tgsi/exec/tgsi_token.h" +#include "x86/rtasm/x86sse.h"  #define ST_FP_MAX_TOKENS 1024 @@ -83,6 +84,11 @@ struct st_vertex_program     struct tgsi_token tokens[ST_FP_MAX_TOKENS];     GLboolean dirty; + +#if defined(USE_X86_ASM) || defined(SLANG_X86) +   struct x86_function  sse2_program; +#endif +  #if 0     struct pipe_constant_buffer constants;  #endif  | 
