Begin added vertex shader state/support.
authorBrian <brian.paul@tungstengraphics.com>
Thu, 16 Aug 2007 19:33:43 +0000 (13:33 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 16 Aug 2007 19:33:43 +0000 (13:33 -0600)
Renamed pipe_fs_state to pipe_shader_state since it can be used for both
vertex and fragment shader info.

12 files changed:
src/mesa/pipe/i915simple/i915_context.h
src/mesa/pipe/i915simple/i915_state.c
src/mesa/pipe/p_context.h
src/mesa/pipe/p_state.h
src/mesa/pipe/softpipe/sp_context.h
src/mesa/pipe/softpipe/sp_state.h
src/mesa/pipe/softpipe/sp_state_fs.c
src/mesa/state_tracker/st_atom_fs.c
src/mesa/state_tracker/st_cb_clear.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_context.h
src/mesa/state_tracker/st_program.h

index d69657d..1e48485 100644 (file)
@@ -105,7 +105,7 @@ struct i915_context
    struct pipe_clip_state clip;
    struct pipe_depth_state depth_test;
    struct pipe_framebuffer_state framebuffer;
-   struct pipe_fs_state fs;
+   struct pipe_shader_state fs;
    struct pipe_poly_stipple poly_stipple;
    struct pipe_scissor_state scissor;
    struct pipe_sampler_state sampler[PIPE_MAX_SAMPLERS];
index f874b21..06fa716 100644 (file)
@@ -111,7 +111,7 @@ static void i915_set_polygon_stipple( struct pipe_context *pipe,
 
 
 static void i915_set_fs_state( struct pipe_context *pipe,
-                          const struct pipe_fs_state *fs )
+                               const struct pipe_shader_state *fs )
 {
    struct i915_context *i915 = i915_context(pipe);
 
index 6679aae..320b487 100644 (file)
@@ -117,7 +117,10 @@ struct pipe_context {
                                   const struct pipe_framebuffer_state * );
 
    void (*set_fs_state)( struct pipe_context *,
-                        const struct pipe_fs_state * );
+                        const struct pipe_shader_state * );
+
+   void (*set_vs_state)( struct pipe_context *,
+                        const struct pipe_shader_state * );
 
    void (*set_polygon_stipple)( struct pipe_context *,
                                const struct pipe_poly_stipple * );
index 4878cb4..c1972c5 100644 (file)
@@ -121,8 +121,8 @@ struct pipe_constant_buffer {
 };
 
 
-struct pipe_fs_state {
-   unsigned inputs_read;               /* FRAG_ATTRIB_* */
+struct pipe_shader_state {
+   unsigned inputs_read;               /* FRAG/VERT_ATTRIB_* */
    const struct tgsi_token *tokens;
    struct pipe_constant_buffer *constants; /* XXX temporary? */
 };
index f45cb6f..8f184c6 100644 (file)
@@ -63,6 +63,7 @@ enum interp_mode {
 #define SP_NEW_TEXTURE     0x800
 #define SP_NEW_STENCIL    0x1000
 #define SP_NEW_VERTEX     0x2000
+#define SP_NEW_VS         0x4000
 
 
 struct softpipe_context {     
@@ -79,7 +80,8 @@ struct softpipe_context {
    struct pipe_clip_state clip;
    struct pipe_depth_state depth_test;
    struct pipe_framebuffer_state framebuffer;
-   struct pipe_fs_state fs;
+   struct pipe_shader_state fs;
+   struct pipe_shader_state vs;
    struct pipe_poly_stipple poly_stipple;
    struct pipe_scissor_state scissor;
    struct pipe_sampler_state sampler[PIPE_MAX_SAMPLERS];
index d754aca..f25a20a 100644 (file)
@@ -56,7 +56,10 @@ void softpipe_set_depth_test_state( struct pipe_context *,
                                     const struct pipe_depth_state * );
 
 void softpipe_set_fs_state( struct pipe_context *,
-                          const struct pipe_fs_state * );
+                            const struct pipe_shader_state * );
+
+void softpipe_set_vs_state( struct pipe_context *,
+                            const struct pipe_shader_state * );
 
 void softpipe_set_polygon_stipple( struct pipe_context *,
                                  const struct pipe_poly_stipple * );
index c7ef1f1..3505c2f 100644 (file)
@@ -31,7 +31,7 @@
 
 
 void softpipe_set_fs_state( struct pipe_context *pipe,
-                          const struct pipe_fs_state *fs )
+                            const struct pipe_shader_state *fs )
 {
    struct softpipe_context *softpipe = softpipe_context(pipe);
 
@@ -41,10 +41,12 @@ void softpipe_set_fs_state( struct pipe_context *pipe,
 }
 
 
+void softpipe_set_vs_state( struct pipe_context *pipe,
+                            const struct pipe_shader_state *vs )
+{
+   struct softpipe_context *softpipe = softpipe_context(pipe);
 
+   memcpy(&softpipe->vs, vs, sizeof(*vs));
 
-
-
-
-
-
+   softpipe->dirty |= SP_NEW_VS;
+}
index 58875de..9731ab6 100644 (file)
 
 #define TGSI_DEBUG 0
 
+
+/**
+ ** Fragment programs
+ **/
+
 static void compile_fs( struct st_context *st,
                        struct st_fragment_program *fs )
 {
@@ -53,7 +58,7 @@ static void compile_fs( struct st_context *st,
 
 static void update_fs( struct st_context *st )
 {
-   struct pipe_fs_state fs;
+   struct pipe_shader_state fs;
    struct st_fragment_program *fp = NULL;
    struct gl_program_parameter_list *params = NULL;
 
@@ -103,3 +108,79 @@ const struct st_tracked_state st_update_fs = {
    },
    .update = update_fs
 };
+
+
+
+/**
+ ** Vertex programs
+ **/
+
+
+static void compile_vs( struct st_context *st,
+                       struct st_vertex_program *vs )
+{
+   /* XXX: fix static allocation of tokens:
+    */
+   tgsi_mesa_compile_vp_program( &vs->Base, vs->tokens, ST_FP_MAX_TOKENS );
+
+   if (TGSI_DEBUG)
+      tgsi_dump( vs->tokens, TGSI_DUMP_VERBOSE );
+}
+
+
+static void update_vs( struct st_context *st )
+{
+   struct pipe_shader_state vs;
+   struct st_vertex_program *vp = NULL;
+   struct gl_program_parameter_list *params = NULL;
+
+   if (st->ctx->Shader.CurrentProgram &&
+       st->ctx->Shader.CurrentProgram->LinkStatus &&
+       st->ctx->Shader.CurrentProgram->VertexProgram) {
+      struct gl_vertex_program *f
+         = st->ctx->Shader.CurrentProgram->VertexProgram;
+      vp = st_vertex_program(f);
+      params = f->Base.Parameters;
+   }
+   else if (st->ctx->VertexProgram._Current) {
+      vp = st_vertex_program(st->ctx->VertexProgram._Current);
+      params = st->ctx->VertexProgram._Current->Base.Parameters;
+   }
+
+   /* XXXX temp */
+   if (!vp)
+      return;
+
+   if (vp && params) {
+      /* load program's constants array */
+      vp->constants.nr_constants = params->NumParameters;
+      memcpy(vp->constants.constant, 
+             params->ParameterValues,
+             params->NumParameters * sizeof(GLfloat) * 4);
+   }
+
+   if (vp->dirty)
+      compile_vs( st, vp );
+
+   memset( &vs, 0, sizeof(vs) );
+   vs.inputs_read = vp->Base.Base.InputsRead;
+   vs.tokens = &vp->tokens[0];
+   vs.constants = &vp->constants;
+   
+   if (memcmp(&vs, &st->state.vs, sizeof(vs)) != 0 ||
+       vp->dirty) 
+   {
+      vp->dirty = 0;
+      st->state.vs = vs;
+      st->pipe->set_vs_state(st->pipe, &vs);
+   }
+}
+
+
+const struct st_tracked_state st_update_vs = {
+   .dirty = {
+      .mesa  = _NEW_PROGRAM,
+      .st   = ST_NEW_VERTEX_PROGRAM,
+   },
+   .update = update_vs
+};
index 2f7ade7..3777c53 100644 (file)
@@ -278,7 +278,7 @@ clear_with_quad(GLcontext *ctx,
    /* fragment shader state: color pass-through program */
    {
       static struct st_fragment_program *stfp = NULL;
-      struct pipe_fs_state fs;
+      struct pipe_shader_state fs;
       if (!stfp) {
          stfp = make_color_shader(st);
       }
index dd27760..11261f1 100644 (file)
@@ -272,7 +272,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
    /* fragment shader state: color pass-through program */
    {
       static struct st_fragment_program *stfp = NULL;
-      struct pipe_fs_state fs;
+      struct pipe_shader_state fs;
       if (!stfp) {
          stfp = make_drawpixels_shader(ctx->st);
       }
index 13843d9..25ed20a 100644 (file)
@@ -73,7 +73,8 @@ struct st_context
       struct pipe_clip_state clip;
       struct pipe_depth_state depth;
       struct pipe_framebuffer_state framebuffer;
-      struct pipe_fs_state     fs;
+      struct pipe_shader_state fs;
+      struct pipe_shader_state vs;
       struct pipe_poly_stipple poly_stipple;
       struct pipe_sampler_state sampler[PIPE_MAX_SAMPLERS];
       struct pipe_scissor_state scissor;
index 8dcb2ce..b077fdf 100644 (file)
@@ -83,7 +83,9 @@ struct st_vertex_program
                                 * ProgramStringNotify changes.
                                 */
 
+   struct tgsi_token tokens[ST_FP_MAX_TOKENS];
    GLboolean dirty;
+   struct pipe_constant_buffer constants;
    GLuint param_state;
 };