Hook-up SSE2 to VS.
authormichal <michal@michal-laptop.(none)>
Fri, 24 Aug 2007 16:51:12 +0000 (17:51 +0100)
committermichal <michal@michal-laptop.(none)>
Fri, 24 Aug 2007 16:51:12 +0000 (17:51 +0100)
src/mesa/pipe/draw/draw_prim.c
src/mesa/pipe/p_state.h
src/mesa/pipe/tgsi/exec/tgsi_exec.c
src/mesa/pipe/tgsi/exec/tgsi_exec.h
src/mesa/pipe/tgsi/exec/tgsi_sse2.c
src/mesa/state_tracker/st_atom_vs.c
src/mesa/state_tracker/st_cb_program.c
src/mesa/state_tracker/st_program.h

index 2d613754e8eee2195dd2becc9dde16c78d8b8dcc..09616cf315c31d9f0867483a34144888eacdcb17 100644 (file)
@@ -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++) {
index e562a8d0585324effe1ab8825236197124ccb06d..25e5861e1e5c671f9324112dce3a545e617cacdc 100644 (file)
@@ -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
index a1f46712b4fd806ad355e4f0cf12e3df0d41f7c6..793f8bc0f68065e3273cebd56a49cf850931e12e 100644 (file)
@@ -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;
index e5e8c3608ed1ca03b297f6960720ad7b5067f5a1..d50f786029281712c34c3ff4ec117b0e4f176527 100644 (file)
@@ -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
index 359775fdfb5df591650e971ad4b094decadb3c82..d89bb1997098759f444cdf38534b1d000a7c4da8 100755 (executable)
@@ -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,
index 7420a495206c2fe2a8bc60a48725067f29c59495..a326c126089b0f291131507427ae2cb53796c6f5 100644 (file)
@@ -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) 
    {
index d0344efa0c3d4345ab10ff5bc8d303822511410e..25da720d8654d638b2eb656249e9f6f6887a4296 100644 (file)
@@ -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 );
 }
 
index e7eb7a8e3f26021a0dc31b6492b640fc73ee7243..883953399cf2a477da363f4f54450bdf2ae8c7db 100644 (file)
@@ -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