Enable SSE2 for vertex shaders.
authormichal <michal@michal-laptop.(none)>
Sat, 27 Oct 2007 13:01:39 +0000 (14:01 +0100)
committermichal <michal@michal-laptop.(none)>
Sat, 27 Oct 2007 18:01:12 +0000 (19:01 +0100)
src/mesa/pipe/draw/draw_private.h
src/mesa/pipe/draw/draw_vertex_shader.c

index 44cf0b1c98aa50888c1a1d32e17b27cc8cfa6ee0..ac47d2a76f625c12cf8a5ff1e58ecfa578b6dd0b 100644 (file)
@@ -124,7 +124,9 @@ struct draw_stage
  */
 struct draw_vertex_shader {
    const struct pipe_shader_state   *state;
+#if defined(__i386__) || defined(__386__)
    struct x86_function              sse2_program;
+#endif
 };
 
 /**
index d8bd5a96d66b2451a6e3e3cfea7c4ff4b7e01177..a2e64b1e4c29b056e153a1b5d4dcc992ed89876b 100644 (file)
@@ -100,20 +100,20 @@ run_vertex_program(struct draw_context *draw,
    draw_vertex_fetch( draw, machine, elts, count );
 
    /* run shader */
-   if( draw->vertex_shader->state->executable != NULL ) {
+#if defined(__i386__) || defined(__386__)
+   {
       /* SSE */
-      codegen_function func = (codegen_function) draw->vertex_shader->state->executable;
+      codegen_function func = (codegen_function) x86_get_func( &draw->vertex_shader->sse2_program );
       func(
          machine->Inputs,
          machine->Outputs,
          machine->Consts,
          machine->Temps );
    }
-   else {
-      /* interpreter */
-      tgsi_exec_machine_run( machine );
-   }
-
+#else
+   /* interpreter */
+   tgsi_exec_machine_run( machine );
+#endif
 
    /* store machine results */
    for (j = 0; j < count; j++) {
@@ -225,11 +225,9 @@ draw_create_vertex_shader(struct draw_context *draw,
       /* cast-away const */
       struct pipe_shader_state *sh = (struct pipe_shader_state *) shader;
 
-      x86_init_func( &sh->sse2_program );
-
-      tgsi_emit_sse2( sh->tokens, &sh->sse2_program );
+      x86_init_func( &vs->sse2_program );
 
-      sh->executable = x86_get_func( &sh->sse2_program );
+      tgsi_emit_sse2( sh->tokens, &vs->sse2_program );
    }
 #endif
 
@@ -255,7 +253,7 @@ void draw_delete_vertex_shader(struct draw_context *draw,
    struct draw_vertex_shader *vs = (struct draw_vertex_shader*)(vcso);
 
 #if defined(__i386__) || defined(__386__)
-   x86_release_func((struct x86_function *) &vs->state->sse2_program);
+   x86_release_func((struct x86_function *) &vs->sse2_program);
 #endif
 
    free((void *) vs->state);