Redoing the way we handle vertex shaders for the draw module.
authorZack Rusin <zack@tungstengraphics.com>
Fri, 28 Sep 2007 08:33:55 +0000 (04:33 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Fri, 28 Sep 2007 16:29:22 +0000 (12:29 -0400)
15 files changed:
src/mesa/pipe/draw/draw_context.c
src/mesa/pipe/draw/draw_context.h
src/mesa/pipe/draw/draw_private.h
src/mesa/pipe/draw/draw_vertex_fetch.c
src/mesa/pipe/draw/draw_vertex_shader.c
src/mesa/pipe/i915simple/i915_state.c
src/mesa/pipe/softpipe/sp_context.c
src/mesa/pipe/softpipe/sp_context.h
src/mesa/pipe/softpipe/sp_state.h
src/mesa/pipe/softpipe/sp_state_derived.c
src/mesa/pipe/softpipe/sp_state_fs.c
src/mesa/state_tracker/st_cb_program.c
src/mesa/state_tracker/st_draw.c
src/mesa/state_tracker/st_program.c
src/mesa/state_tracker/st_program.h

index 66c66ff698e86ba9bc405e4226ed5b8231191390..5efb173228f879826250239c8eca266800c13143 100644 (file)
@@ -155,14 +155,6 @@ void draw_set_viewport_state( struct draw_context *draw,
 }
 
 
-void
-draw_set_vertex_shader(struct draw_context *draw,
-                       const struct pipe_shader_state *shader)
-{
-   draw_flush( draw );
-   draw->vertex_shader = *shader;
-}
-
 
 void
 draw_set_vertex_buffer(struct draw_context *draw,
index 0ccf5f60466563fe4287b12d7ca35d8311306046..398e96d94d21bd136206df6d6ef03dffb07035d5 100644 (file)
@@ -92,9 +92,12 @@ void draw_set_rasterize_stage( struct draw_context *draw,
                                struct draw_stage *stage );
 
 
-void
-draw_set_vertex_shader(struct draw_context *draw,
-                       const struct pipe_shader_state *shader);
+void * draw_create_vertex_shader(struct draw_context *draw,
+                                 const struct pipe_shader_state *shader);
+void draw_bind_vertex_shader(struct draw_context *draw,
+                             void *vcso);
+void draw_delete_vertex_shader(struct draw_context *draw,
+                               void *vcso);
 
 
 void
index ebef5347ab951660ae32d5880e009b2766e0b4e9..2f52299f74a1e890d3703f425fa8f2ee4093b1bf 100644 (file)
@@ -46,6 +46,7 @@
 
 #include "draw_vertex.h"
 
+#include "x86/rtasm/x86sse.h"
 
 /**
  * Basic vertex info.
@@ -104,7 +105,7 @@ struct draw_stage
 
    void (*tri)( struct draw_stage *,
                struct prim_header * );
-   
+
    void (*end)( struct draw_stage * );
 
    void (*reset_stipple_counter)( struct draw_stage * );
@@ -116,6 +117,15 @@ struct draw_stage
 #define VCACHE_OVERFLOW        4
 #define VS_QUEUE_LENGTH        (VCACHE_SIZE + VCACHE_OVERFLOW + 1)     /* can never fill up */
 
+/**
+ * Private version of the compiled vertex_shader
+ */
+struct draw_vertex_shader {
+   const struct pipe_shader_state *state;
+#if defined(__i386__) || defined(__386__)
+   struct x86_function  sse2_program;
+#endif
+};
 
 /**
  * Private context for the drawing module.
@@ -145,7 +155,7 @@ struct draw_context
    struct pipe_viewport_state viewport;
    struct pipe_vertex_buffer vertex_buffer[PIPE_ATTRIB_MAX];
    struct pipe_vertex_element vertex_element[PIPE_ATTRIB_MAX];
-   struct pipe_shader_state vertex_shader;
+   const struct draw_vertex_shader *vertex_shader;
    struct pipe_vertex_buffer feedback_buffer[PIPE_ATTRIB_MAX];
    struct pipe_vertex_element feedback_element[PIPE_ATTRIB_MAX];
 
index 2b839d641ebad787dc2be094be41e72ed4e12dde..bc37e18c341925fa82998700d28f1e8c300c5cd4 100644 (file)
@@ -85,7 +85,7 @@ void draw_vertex_fetch( struct draw_context *draw,
       /*printf("fetch vertex %u: \n", j);*/
 
       /* loop over vertex attributes (vertex shader inputs) */
-      for (attr = 0; attr < draw->vertex_shader.num_inputs; attr++) {
+      for (attr = 0; attr < draw->vertex_shader->state->num_inputs; attr++) {
 
          unsigned buf = draw->vertex_element[attr].vertex_buffer_index;
          const void *src
index a2e1cdc472d24342c17f696724382563047cfd9e..f7ddbd19093b2e18c8a53faf3b90367bcb3dbac9 100644 (file)
@@ -36,6 +36,8 @@
 #include "draw_context.h"
 #include "draw_vertex.h"
 
+#include "x86/rtasm/x86sse.h"
+
 #include "pipe/tgsi/exec/tgsi_core.h"
 
 static INLINE unsigned
@@ -70,6 +72,7 @@ typedef void (XSTDCALL *codegen_function) (
    float (*constant)[4],
    struct tgsi_exec_vector *temporary );
 
+
 /**
  * Transform vertices with the current vertex program/shader
  * Up to four vertices can be shaded at a time.
@@ -92,7 +95,7 @@ run_vertex_program(struct draw_context *draw,
    const float *trans = draw->viewport.translate;
 
    assert(count <= 4);
-   assert(draw->vertex_shader.output_semantic_name[0]
+   assert(draw->vertex_shader->state->output_semantic_name[0]
           == TGSI_SEMANTIC_POSITION);
 
 #ifdef DEBUG
@@ -101,7 +104,7 @@ run_vertex_program(struct draw_context *draw,
 
    /* init machine state */
    tgsi_exec_machine_init(&machine,
-                          draw->vertex_shader.tokens,
+                          draw->vertex_shader->state->tokens,
                           PIPE_MAX_SAMPLERS,
                           NULL /*samplers*/ );
 
@@ -114,8 +117,8 @@ run_vertex_program(struct draw_context *draw,
    draw_vertex_fetch( draw, &machine, elts, count );
 
    /* run shader */
-   if( draw->vertex_shader.executable != NULL ) {
-      codegen_function func = (codegen_function) draw->vertex_shader.executable;
+   if( draw->vertex_shader->state->executable != NULL ) {
+      codegen_function func = (codegen_function) draw->vertex_shader->state->executable;
       func(
          machine.Inputs,
          machine.Outputs,
@@ -206,3 +209,42 @@ void draw_vertex_shader_queue_flush( struct draw_context *draw )
    draw->vs.queue_nr = 0;
 }
 
+
+void *
+draw_create_vertex_shader(struct draw_context *draw,
+                          const struct pipe_shader_state *shader)
+{
+   struct draw_vertex_shader *vs = calloc(1, sizeof(struct draw_vertex_shader));
+
+   vs->state = shader;
+#if defined(__i386__) || defined(__386__)
+   x86_init_func(&vs->sse2_program);
+
+   tgsi_emit_sse2(shader->tokens, &vs->sse2_program);
+
+   ((struct pipe_shader_state*)(vs->state))->executable =
+      x86_get_func(&vs->sse2_program);
+#endif
+
+   return vs;
+}
+
+void draw_bind_vertex_shader(struct draw_context *draw,
+                             void *vcso)
+{
+   draw_flush(draw);
+   draw->vertex_shader = (struct draw_vertex_shader*)(vcso);
+}
+
+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);
+#endif
+   free(vcso);
+}
+
+
+
index 5c6d37a4661562aa25a75d2e963476e65901a5eb..19ca5e575fb098b7a48a2a4c136b09b46785090c 100644 (file)
@@ -443,16 +443,13 @@ static void i915_set_polygon_stipple( struct pipe_context *pipe,
 {
 }
 
-
-static void *
-i915_create_shader_state(struct pipe_context *pipe,
-                         const struct pipe_shader_state *templ)
+static void * i915_create_fs_state(struct pipe_context *pipe,
+                                   const struct pipe_shader_state *templ)
 {
    return 0;
 }
 
-static void i915_bind_fs_state( struct pipe_context *pipe,
-                               void *fs )
+static void i915_bind_fs_state(struct pipe_context *pipe, void *fs)
 {
    struct i915_context *i915 = i915_context(pipe);
 
@@ -461,20 +458,35 @@ static void i915_bind_fs_state( struct pipe_context *pipe,
    i915->dirty |= I915_NEW_FS;
 }
 
+static void i915_delete_fs_state(struct pipe_context *pipe, void *shader)
+{
+   /*do nothing*/
+}
 
-static void i915_bind_vs_state(struct pipe_context *pipe,
-                               void *vs)
+static void *
+i915_create_vs_state(struct pipe_context *pipe,
+                     const struct pipe_shader_state *templ)
 {
    struct i915_context *i915 = i915_context(pipe);
 
    /* just pass-through to draw module */
-   draw_set_vertex_shader(i915->draw, (const struct pipe_shader_state *)vs);
+   return draw_create_vertex_shader(i915->draw, templ);
 }
 
-static void i915_delete_shader_state(struct pipe_context *pipe,
-                                     void *shader)
+static void i915_bind_vs_state(struct pipe_context *pipe, void *vs)
 {
-   /*do nothing*/
+   struct i915_context *i915 = i915_context(pipe);
+
+   /* just pass-through to draw module */
+   draw_bind_vertex_shader(i915->draw, vs);
+}
+
+static void i915_delete_vs_state(struct pipe_context *pipe, void *shader)
+{
+   struct i915_context *i915 = i915_context(pipe);
+
+   /* just pass-through to draw module */
+   draw_delete_vertex_shader(i915->draw, shader);
 }
 
 static void i915_set_constant_buffer(struct pipe_context *pipe,
@@ -707,12 +719,12 @@ i915_init_state_functions( struct i915_context *i915 )
    i915->pipe.create_rasterizer_state = i915_create_rasterizer_state;
    i915->pipe.bind_rasterizer_state = i915_bind_rasterizer_state;
    i915->pipe.delete_rasterizer_state = i915_delete_rasterizer_state;
-   i915->pipe.create_fs_state = i915_create_shader_state;
+   i915->pipe.create_fs_state = i915_create_fs_state;
    i915->pipe.bind_fs_state = i915_bind_fs_state;
-   i915->pipe.delete_fs_state = i915_delete_shader_state;
-   i915->pipe.create_vs_state = i915_create_shader_state;
+   i915->pipe.delete_fs_state = i915_delete_fs_state;
+   i915->pipe.create_vs_state = i915_create_vs_state;
    i915->pipe.bind_vs_state = i915_bind_vs_state;
-   i915->pipe.delete_vs_state = i915_delete_shader_state;
+   i915->pipe.delete_vs_state = i915_delete_vs_state;
 
    i915->pipe.set_blend_color = i915_set_blend_color;
    i915->pipe.set_clip_state = i915_set_clip_state;
index e415966dae1429d3aa481151c2c4a5f9e2133cba..695bf1a9e02efc0cf289e35834c6069e3dc7c1f4 100644 (file)
@@ -275,12 +275,12 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
    softpipe->pipe.create_rasterizer_state = softpipe_create_rasterizer_state;
    softpipe->pipe.bind_rasterizer_state   = softpipe_bind_rasterizer_state;
    softpipe->pipe.delete_rasterizer_state = softpipe_delete_rasterizer_state;
-   softpipe->pipe.create_fs_state = softpipe_create_shader_state;
+   softpipe->pipe.create_fs_state = softpipe_create_fs_state;
    softpipe->pipe.bind_fs_state   = softpipe_bind_fs_state;
-   softpipe->pipe.delete_fs_state = softpipe_delete_shader_state;
-   softpipe->pipe.create_vs_state = softpipe_create_shader_state;
+   softpipe->pipe.delete_fs_state = softpipe_delete_fs_state;
+   softpipe->pipe.create_vs_state = softpipe_create_vs_state;
    softpipe->pipe.bind_vs_state   = softpipe_bind_vs_state;
-   softpipe->pipe.delete_vs_state = softpipe_delete_shader_state;
+   softpipe->pipe.delete_vs_state = softpipe_delete_vs_state;
 
    softpipe->pipe.set_blend_color = softpipe_set_blend_color;
    softpipe->pipe.set_clip_state = softpipe_set_clip_state;
index c0a681f3d6b30134050e2758395c3e421c15bcaf..ccf29b5683d64e280f87bdb9ada946edc0203b5a 100644 (file)
@@ -62,8 +62,12 @@ struct draw_stage;
 #define SP_NEW_VS            0x2000
 #define SP_NEW_CONSTANTS     0x4000
 
+struct sp_vertex_shader_state {
+   const struct pipe_shader_state *state;
+   void  *draw_data;
+};
 
-struct softpipe_context {     
+struct softpipe_context {
    struct pipe_context pipe;  /**< base class */
    struct softpipe_winsys *winsys;     /**< window system interface */
 
@@ -76,7 +80,7 @@ struct softpipe_context {
    const struct pipe_depth_stencil_state   *depth_stencil;
    const struct pipe_rasterizer_state *rasterizer;
    const struct pipe_shader_state *fs;
-   const struct pipe_shader_state *vs;
+   const struct sp_vertex_shader_state *vs;
 
    struct pipe_blend_color blend_color;
    struct pipe_clear_color_state clear_color;
index f0e1461d2582d2204850ee3854cb3c102883f0dc..f9061e86e5366a0b95381396b448c0adc0d8e876 100644 (file)
@@ -87,12 +87,14 @@ void softpipe_set_constant_buffer(struct pipe_context *,
 void softpipe_set_feedback_state( struct pipe_context *,
                                   const struct pipe_feedback_state * );
 
-void *
-softpipe_create_shader_state( struct pipe_context *,
-                              const struct pipe_shader_state * );
-void softpipe_bind_fs_state( struct pipe_context *, void * );
-void softpipe_bind_vs_state( struct pipe_context *, void * );
-void softpipe_delete_shader_state( struct pipe_context *, void * );
+void *softpipe_create_fs_state(struct pipe_context *,
+                               const struct pipe_shader_state *);
+void softpipe_bind_fs_state(struct pipe_context *, void *);
+void softpipe_delete_fs_state(struct pipe_context *, void *);
+void *softpipe_create_vs_state(struct pipe_context *,
+                               const struct pipe_shader_state *);
+void softpipe_bind_vs_state(struct pipe_context *, void *);
+void softpipe_delete_vs_state(struct pipe_context *, void *);
 
 void softpipe_set_polygon_stipple( struct pipe_context *,
                                  const struct pipe_poly_stipple * );
index 6c6e79806987e215338cc20e11bf3489c62d32d1..b6145df8e258af57caf86c9b07734f734d327f0d 100644 (file)
@@ -43,7 +43,7 @@
  */
 static void calculate_vertex_layout( struct softpipe_context *softpipe )
 {
-   const struct pipe_shader_state *vs = softpipe->vs;
+   const struct pipe_shader_state *vs = softpipe->vs->state;
    const struct pipe_shader_state *fs = softpipe->fs;
    const interp_mode colorInterp
       = softpipe->rasterizer->flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
index 8306a95f449560397b994a7dd6e9e8b476e99c7b..f1bec2c73acdb05a1205d49ce54f7e21aac658ff 100644 (file)
 #include "pipe/draw/draw_context.h"
 
 
-void * softpipe_create_shader_state(struct pipe_context *pipe,
-                                    const struct pipe_shader_state *templ)
+void * softpipe_create_fs_state(struct pipe_context *pipe,
+                                const struct pipe_shader_state *templ)
 {
-   /* we just want the pipe_shader_state template in the bind calls */
+   /* Decide whether we'll be codegenerating this shader and if so do
+    * that now.
+    */
+
    return 0;
 }
 
@@ -49,25 +52,51 @@ void softpipe_bind_fs_state(struct pipe_context *pipe, void *fs)
    softpipe->dirty |= SP_NEW_FS;
 }
 
+void softpipe_delete_fs_state(struct pipe_context *pipe,
+                              void *shader)
+{
+}
+
+
+void * softpipe_create_vs_state(struct pipe_context *pipe,
+                                const struct pipe_shader_state *templ)
+{
+   struct softpipe_context *softpipe = softpipe_context(pipe);
+   struct sp_vertex_shader_state *state =
+      malloc(sizeof(struct sp_vertex_shader_state));
+
+   state->state = templ;
+   state->draw_data = draw_create_vertex_shader(softpipe->draw,
+                                                state->state);
+
+   return state;
+}
 
 void softpipe_bind_vs_state(struct pipe_context *pipe, void *vs)
 {
    struct softpipe_context *softpipe = softpipe_context(pipe);
 
-   softpipe->vs = (struct pipe_shader_state *)vs;
+   softpipe->vs = (const struct sp_vertex_shader_state *)vs;
 
-   softpipe->dirty |= SP_NEW_VS;
+   draw_bind_vertex_shader(softpipe->draw, softpipe->vs->draw_data);
 
-   draw_set_vertex_shader(softpipe->draw, (struct pipe_shader_state *)vs);
+   softpipe->dirty |= SP_NEW_VS;
 }
 
-
-void softpipe_delete_shader_state( struct pipe_context *pipe,
-                                   void *shader )
+void softpipe_delete_vs_state(struct pipe_context *pipe,
+                              void *vs)
 {
-   /* do nothing */
+   struct softpipe_context *softpipe = softpipe_context(pipe);
+
+   struct sp_vertex_shader_state *state =
+      (struct sp_vertex_shader_state *)vs;
+
+   draw_delete_vertex_shader(softpipe->draw, state->draw_data);
+   free(state);
 }
 
+
+
 void softpipe_set_constant_buffer(struct pipe_context *pipe,
                                   uint shader, uint index,
                                   const struct pipe_constant_buffer *buf)
index 25dbc2c24424199eef91c4b83e11644b4b077ee8..3a7ce9405e87bb57dbc863570a83c787a0b662ff 100644 (file)
@@ -86,10 +86,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_vertex_program( ctx, 
                                        &prog->Base,
                                        target, 
@@ -129,9 +125,6 @@ static void st_delete_program( GLcontext *ctx,
    case GL_VERTEX_PROGRAM_ARB:
       {
          struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
-#if defined(__i386__) || defined(__386__)
-         x86_release_func( &stvp->sse2_program );
-#endif
          st_remove_vertex_program(st, stvp);
       }
       break;
index ce5bf0c8a94e4d65fa70761376b5da174d145418..7c836ba2c1357dce74a03263145f86c3f7dab34d 100644 (file)
@@ -405,7 +405,7 @@ st_feedback_draw_vbo(GLcontext *ctx,
    draw_set_viewport_state(draw, &st->state.viewport);
    draw_set_clip_state(draw, &st->state.clip);
    draw_set_rasterizer_state(draw, &st->state.rasterizer->state);
-   draw_set_vertex_shader(draw, &st->state.vs->state);
+   draw_bind_vertex_shader(draw, st->state.vs->data);
    /* XXX need to set vertex info too */
 
 
index 44cc33b09fb6828dc21b83203c92ade60bf1de3e..116b59a067a1620acdd4673c119bf51b56a7f6a4 100644 (file)
@@ -253,14 +253,6 @@ st_translate_vertex_program(struct st_context *st,
    if (TGSI_DEBUG)
       tgsi_dump( tokensOut, 0 );
 
-#if defined(__i386__) || defined(__386__)
-   if (stvp->sse2_program.csr == stvp->sse2_program.store)
-      tgsi_emit_sse2( tokensOut, &stvp->sse2_program );
-
-   if (!cso->state.executable)
-      ((struct cso_vertex_shader*)cso)->state.executable = (void *) x86_get_func( &stvp->sse2_program );
-#endif
-
    return cso;
 }
 
index 6e106c16b020fb89d5f41dccd4eb3a4bfc74551e..2b792013131007e75ce26465d06ff91425069c7f 100644 (file)
@@ -79,10 +79,6 @@ struct st_vertex_program
    /** The program in TGSI format */
    struct tgsi_token tokens[ST_FP_MAX_TOKENS];
 
-#if defined(__i386__) || defined(__386__)
-   struct x86_function  sse2_program;
-#endif
-
    /** Pointer to the corresponding cached shader */
    const struct cso_vertex_shader *vs;