Track fragment and vertex shader code generation via pipe shader state objects.
authorMichel Dänzer <michel@tungstengraphics.com>
Wed, 3 Oct 2007 18:33:23 +0000 (20:33 +0200)
committerMichel Dänzer <michel@tungstengraphics.com>
Wed, 3 Oct 2007 18:33:23 +0000 (20:33 +0200)
Unfortunately, the generated fragment shader code is effectively unusable until
it handles quad->mask.

src/mesa/pipe/draw/draw_private.h
src/mesa/pipe/draw/draw_vertex_shader.c
src/mesa/pipe/p_state.h
src/mesa/pipe/softpipe/sp_context.c
src/mesa/pipe/softpipe/sp_context.h
src/mesa/pipe/softpipe/sp_quad_fs.c
src/mesa/pipe/softpipe/sp_state_fs.c
src/mesa/state_tracker/st_cb_program.c
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h

index b3f1c4d23ea770c0ca12612b01e3b8e9fd5956d1..79b2176c59c90fb89a3a6bdf6ad5e8c1b622fa7c 100644 (file)
@@ -124,9 +124,6 @@ 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 49ff3b32ff4a8a4a5d92eb43a6d80f6151733f05..e99537f16c2968494d85dda53dbe5c5b8304840a 100644 (file)
@@ -214,12 +214,13 @@ draw_create_vertex_shader(struct draw_context *draw,
 
    vs->state = shader;
 #if defined(__i386__) || defined(__386__)
-   x86_init_func(&vs->sse2_program);
-
    if (draw->use_sse) {
-      tgsi_emit_sse2(shader->tokens, &vs->sse2_program);
-      ((struct pipe_shader_state*)(vs->state))->executable =
-         x86_get_func(&vs->sse2_program);
+      x86_init_func( &shader->sse2_program );
+
+      tgsi_emit_sse2( shader->tokens, &shader->sse2_program );
+
+      ((struct pipe_shader_state *)shader)->executable = (void *)
+        x86_get_func( &shader->sse2_program );
    }
 #endif
 
@@ -243,9 +244,12 @@ void draw_delete_vertex_shader(struct draw_context *draw,
                                void *vcso)
 {
    struct draw_vertex_shader *vs = (struct draw_vertex_shader*)(vcso);
+
 #if defined(__i386__) || defined(__386__)
-   x86_release_func(&vs->sse2_program);
+   x86_release_func(&vs->state->sse2_program);
 #endif
+
+   free(vs->state);
    free(vcso);
 }
 
index b4fc01bfc5c5ea9bacfae0dbb13f53d1cf51d81a..ac9d7009cc02172793057ec89c68e19f7c4cba2c 100644 (file)
@@ -40,6 +40,8 @@
 
 #include "p_compiler.h"
 
+#include "x86/rtasm/x86sse.h"
+
 /**
  * Implementation limits
  */
@@ -143,6 +145,9 @@ struct pipe_constant_buffer {
 
 struct pipe_shader_state {
    const struct tgsi_token *tokens;
+#if defined(__i386__) || defined(__386__)
+   struct x86_function sse2_program;
+#endif
    void *executable;
 
    /** These fields somewhat constitute the shader "signature" */
index 610e7ad6899940173414560c65b5d5a57d71ae11..daccc8fe238bc54c8303bffdf81402bfe830c5bd 100644 (file)
@@ -249,6 +249,12 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
 {
    struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context);
 
+#if defined(__i386__) || defined(__386__)
+   softpipe->use_sse = getenv("GALLIUM_SSE") != NULL;
+#else
+   softpipe->use_sse = false;
+#endif
+
    softpipe->pipe.winsys = pipe_winsys;
    softpipe->pipe.destroy = softpipe_destroy;
 
index ccf29b5683d64e280f87bdb9ada946edc0203b5a..4f429e8139795071359e17aebbabf5c22db61a0b 100644 (file)
@@ -154,6 +154,8 @@ struct softpipe_context {
    struct draw_stage *vbuf;
 
    struct pipe_surface *cbuf;      /**< current color buffer (one of cbufs) */
+
+   int use_sse : 1;
 };
 
 
index f394c587dc8bf332d3acf76eaee67e84a5202f87..a8c25c48683675d3c8b22c203224aa69a852e498 100755 (executable)
@@ -103,7 +103,8 @@ shade_quad(
    machine->Inputs[0].xyzw[1].f[3] = fy + 1.0f;
 
    /* run shader */
-   if( softpipe->fs->executable != NULL ) {
+   /* XXX: Generated code effectively unusable until it handles quad->mask */
+   if( !quad->mask && softpipe->fs->executable != NULL ) {
       codegen_function func = (codegen_function) softpipe->fs->executable;
       func(
          machine->Inputs,
index 88d9bd9716827d5c128d6bc6c2e1fb485ebc556d..5547c849ac9bcd2061fa1ad23873a7d0e01853ee 100644 (file)
 #include "pipe/p_defines.h"
 #include "pipe/p_winsys.h"
 #include "pipe/draw/draw_context.h"
+#include "pipe/tgsi/exec/tgsi_core.h"
 
 
 void * softpipe_create_fs_state(struct pipe_context *pipe,
                                 const struct pipe_shader_state *templ)
 {
+   struct softpipe_context *softpipe = softpipe_context(pipe);
+
    /* Decide whether we'll be codegenerating this shader and if so do
     * that now.
     */
 
    struct pipe_shader_state *state = malloc(sizeof(struct pipe_shader_state));
    memcpy(state, templ, sizeof(struct pipe_shader_state));
+
+#if defined(__i386__) || defined(__386__)
+   if (softpipe->use_sse) {
+      x86_init_func( &state->sse2_program );
+
+      tgsi_emit_sse2_fs( state->tokens, &state->sse2_program );
+
+      state->executable = (void *)x86_get_func( &state->sse2_program );
+   }
+#endif
+
    return state;
 }
 
@@ -57,6 +71,12 @@ void softpipe_bind_fs_state(struct pipe_context *pipe, void *fs)
 void softpipe_delete_fs_state(struct pipe_context *pipe,
                               void *shader)
 {
+#if defined(__i386__) || defined(__386__)
+   struct pipe_shader_state *state = shader;
+
+   x86_release_func( &state->sse2_program );
+#endif
+
    free(shader);
 }
 
index 1902c8d7d6189a118f00222e924fd50f89c2c628..23a7bf473e50ad722f7529ae5b2df606416e86c3 100644 (file)
@@ -108,10 +108,6 @@ static struct gl_program *st_new_program( GLcontext *ctx,
 
       prog->serialNo = 1;
 
-#if defined(__i386__) || defined(__386__)
-      x86_init_func( &prog->sse2_program );
-#endif
-
       return _mesa_init_fragment_program( ctx, 
                                          &prog->Base,
                                          target, 
@@ -140,9 +136,6 @@ static void st_delete_program( GLcontext *ctx,
       {
          struct st_fragment_program *stfp
             = (struct st_fragment_program *) prog;
-#if defined(__i386__) || defined(__386__)
-         x86_release_func( &stfp->sse2_program );
-#endif
          st_remove_fragment_program(st, stfp);
       }
       break;
index a00f296d15f05b922bcd3f3daecdb216e1b05506..807cd8cb052a0613ee248fe0375dd1cf093ff8b6 100644 (file)
@@ -390,16 +390,6 @@ st_translate_fragment_program(struct st_context *st,
    if (TGSI_DEBUG)
       tgsi_dump( tokensOut, 0/*TGSI_DUMP_VERBOSE*/ );
 
-#if defined(__i386__) || defined(__386__)
-   if (draw_use_sse(st->draw)) {
-      if (stfp->sse2_program.csr == stfp->sse2_program.store)
-         tgsi_emit_sse2_fs( tokensOut, &stfp->sse2_program );
-
-      if (!cso->state.executable)
-         ((struct cso_fragment_shader*)cso)->state.executable = (void *) x86_get_func( &stfp->sse2_program );
-   }
-#endif
-
    return cso;
 }
 
index a714f3f5b01d74450de1f729fb45a4662596a551..ae89055e82c7bb43d97e5e0a7d2574207000cf60 100644 (file)
@@ -61,10 +61,6 @@ struct st_fragment_program
    /** The program in TGSI format */
    struct tgsi_token tokens[ST_MAX_SHADER_TOKENS];
 
-#if defined(__i386__) || defined(__386__)
-   struct x86_function  sse2_program;
-#endif
-
    /** Pointer to the corresponding cached shader */
    const struct cso_fragment_shader *fs;