tgsi: Fall back to interpreter instead of assert(0) on unimplemented SSE code.
authorMichel Dänzer <michel@tungstengraphics.com>
Thu, 7 Feb 2008 19:44:42 +0000 (19:44 +0000)
committerBen Skeggs <skeggsb@gmail.com>
Fri, 15 Feb 2008 02:50:32 +0000 (13:50 +1100)
src/mesa/pipe/draw/draw_vertex_shader.c
src/mesa/pipe/tgsi/exec/tgsi_sse2.c
src/mesa/x86/rtasm/x86sse.c

index e6590eafcc8a97d95e11f1b72236f32dc5bec2e5..5ca93aa615255c63904250cf66ba699f0c5e0ad5 100644 (file)
@@ -121,11 +121,16 @@ run_vertex_program(struct draw_context *draw,
          = (struct draw_vertex_shader *)draw->vertex_shader;
       codegen_function func
          = (codegen_function) x86_get_func( &shader->sse2_program );
-      func(
-         machine->Inputs,
-         machine->Outputs,
-         machine->Consts,
-         machine->Temps );
+
+      if (func)
+         func(
+            machine->Inputs,
+            machine->Outputs,
+            machine->Consts,
+            machine->Temps );
+      else
+         /* interpreter */
+         tgsi_exec_machine_run( machine );
    }
    else
 #endif
@@ -269,7 +274,12 @@ draw_create_vertex_shader(struct draw_context *draw,
       struct pipe_shader_state *sh = (struct pipe_shader_state *) shader;
 
       x86_init_func( &vs->sse2_program );
-      tgsi_emit_sse2( (struct tgsi_token *) sh->tokens, &vs->sse2_program );
+      if (!tgsi_emit_sse2( (struct tgsi_token *) sh->tokens,
+                           &vs->sse2_program )) {
+         x86_release_func( (struct x86_function *) &vs->sse2_program );
+        fprintf(stdout /*err*/,
+                "tgsi_emit_sse2() failed, falling back to interpreter\n");
+      }
    }
 #endif
 
index f2180082f1513c6d6065b446960a37336f325e14..40bacf8552612401dcb73379d5b9441a172cb28b 100755 (executable)
@@ -2254,8 +2254,7 @@ tgsi_emit_sse2(
 
       case TGSI_TOKEN_TYPE_IMMEDIATE:
          /* XXX implement this */
-         assert(0);
-         break;
+         return 0;
 
       default:
          assert( 0 );
index 56c211eee062de9d7b3cb863077b1cbe864a7db8..f8da6e405f40d64625b1ca2c6e453d6b77c9af1e 100644 (file)
@@ -1137,6 +1137,7 @@ void x86_init_func_size( struct x86_function *p, unsigned code_size )
 void x86_release_func( struct x86_function *p )
 {
    _mesa_exec_free(p->store);
+   p->store = NULL;
 }