Trigger tgsi compilation for fragment programs.
authorKeith Whitwell <keith@tungstengraphics.com>
Thu, 19 Jul 2007 19:24:55 +0000 (20:24 +0100)
committerKeith Whitwell <keith@tungstengraphics.com>
Thu, 19 Jul 2007 19:24:55 +0000 (20:24 +0100)
Not sure the generated program looks correct though...

12 files changed:
src/mesa/pipe/p_state.h
src/mesa/pipe/softpipe/sp_state_derived.c
src/mesa/pipe/tgsi/core/tgsi_dump.c
src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.h
src/mesa/sources
src/mesa/state_tracker/st_atom.c
src/mesa/state_tracker/st_atom.h
src/mesa/state_tracker/st_atom_fs.c
src/mesa/state_tracker/st_atom_vs.c [new file with mode: 0644]
src/mesa/state_tracker/st_cb_program.c
src/mesa/state_tracker/st_context.h
src/mesa/state_tracker/st_program.h

index fd5e7ad3af9069d8c1e1270b1d1b6d0ea6236790..e3f62a80ad712fc2d99f0d54e9986f029e6422a4 100644 (file)
@@ -121,8 +121,11 @@ struct pipe_clip_state {
    GLuint nr;
 };
 
+
 struct pipe_fs_state {
-   struct gl_fragment_program *fp;
+   GLuint inputs_read;         /* FRAG_ATTRIB_* */
+   const struct tgsi_token *tokens;
+   
 };
 
 struct pipe_constant_buffer {
index 18dfb50e381f7b0de1350b968bba3839093dd0f6..fcdedb54a939fef5292e7fa55e8b10660a5d3f51 100644 (file)
@@ -28,7 +28,6 @@
 #include "main/glheader.h"
 #include "main/macros.h"
 #include "main/enums.h"
-#include "shader/program.h"
 
 #include "vf/vf.h"
 #include "pipe/draw/draw_context.h"
@@ -68,8 +67,7 @@ static const GLuint frag_to_vf[FRAG_ATTRIB_MAX] =
  */
 static void calculate_vertex_layout( struct softpipe_context *softpipe )
 {
-   struct gl_fragment_program *fp = softpipe->fs.fp;
-   const GLuint inputsRead = fp->Base.InputsRead;
+   const GLuint inputsRead = softpipe->fs.inputs_read;
    GLuint slot_to_vf_attr[VF_ATTRIB_MAX];
    GLbitfield attr_mask = 0x0;
    GLuint i;
index fecb246ab1aa1f3fab08bdc4631db7b288008066..0345fd93f7fc34f1b039b4828daa57ee2dda6447 100644 (file)
@@ -400,12 +400,16 @@ tgsi_dump(
    GLuint deflt = !(flags & TGSI_DUMP_NO_DEFAULT);
 
    {
+#if 0
       static GLuint counter = 0;
       char buffer[64];
 
       sprintf( buffer, "sbir-dump-%.4u.txt", counter++ );
       dump.file = fopen( buffer, "wt" );
+#else
+      dump.file = stderr;
       dump.tabs = 0;
+#endif
    }
 
    tgsi_parse_init( &parse, tokens );
index 4c1141e5796837d4afc9f577d0b21d74a75d6f9c..9256318997a6ef7abf9e1ee621a5c792564dc4a6 100644 (file)
@@ -5,6 +5,8 @@
 extern "C" {\r
 #endif // defined __cplusplus\r
 \r
+struct tgsi_token;\r
+\r
 GLboolean\r
 tgsi_mesa_compile_fp_program(\r
    const struct gl_fragment_program *program,\r
index a76e41bdda30828db508003a0567f7c1cca34fb9..a589ae4373b87618912ed3e9462c5a70e548f09e 100644 (file)
@@ -206,6 +206,7 @@ STATETRACKER_SOURCES = \
        state_tracker/st_atom_clip.c \
        state_tracker/st_atom_depth.c \
        state_tracker/st_atom_fs.c \
+       state_tracker/st_atom_vs.c \
        state_tracker/st_atom_framebuffer.c \
        state_tracker/st_atom_sampler.c \
        state_tracker/st_atom_scissor.c \
index dfebfb4768c735032125e52439db8a2701d1b1cd..85c99bc1822e01c23d07e27e64adde88e2794a7f 100644 (file)
@@ -46,6 +46,7 @@ static const struct st_tracked_state *atoms[] =
    &st_update_clear_color,
    &st_update_depth,
    &st_update_clip,
+   &st_update_vs,
    &st_update_fs,
    &st_update_setup,
    &st_update_polygon_stipple,
index a56483ac3968b9b66cddd7713c6b6941f6f4413d..1b70e279339a891e8a8e570e2821af90bd193ab7 100644 (file)
@@ -49,6 +49,7 @@ const struct st_tracked_state st_update_clip;
 const struct st_tracked_state st_update_clear_color;
 const struct st_tracked_state st_update_depth;
 const struct st_tracked_state st_update_fs;
+const struct st_tracked_state st_update_vs;
 const struct st_tracked_state st_update_setup;
 const struct st_tracked_state st_update_polygon_stipple;
 const struct st_tracked_state st_update_viewport;
index 9c6bc1ce2af1cf356363138ea06b1c13c1d2e587..6fa4f53c73460c725bcb5ed5cbad73dac1c63f4e 100644 (file)
 #include "st_context.h"
 #include "pipe/p_context.h"
 #include "st_atom.h"
+#include "st_program.h"
+#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
+#include "pipe/tgsi/core/tgsi_dump.h"
+
+static void compile_fs( struct st_context *st,
+                       struct st_fragment_program *fs )
+{
+   /* XXX: fix static allocation of tokens:
+    */
+   tgsi_mesa_compile_fp_program( &fs->Base, fs->tokens, ST_FP_MAX_TOKENS );
+
+   tgsi_dump( fs->tokens, TGSI_DUMP_VERBOSE );
+}
 
 
 static void update_fs( struct st_context *st )
 {
    struct pipe_fs_state fs;
+   struct st_fragment_program *fp = st_fragment_program(st->ctx->FragmentProgram._Current);
+
+   memset( &fs, 0, sizeof(fs) );
 
-   fs.fp = st->ctx->FragmentProgram._Current;
+   if (fp->dirty)
+      compile_fs( st, fp );
+   
+   fs.inputs_read = fp->Base.Base.InputsRead;
+   fs.tokens = &fp->tokens[0];
    
-   if (memcmp(&fs, &st->state.fs, sizeof(fs)) != 0) {
+   if (memcmp(&fs, &st->state.fs, sizeof(fs)) != 0 ||
+       fp->dirty) 
+   {
+      fp->dirty = 0;
       st->state.fs = fs;
       st->pipe->set_fs_state(st->pipe, &fs);
    }
diff --git a/src/mesa/state_tracker/st_atom_vs.c b/src/mesa/state_tracker/st_atom_vs.c
new file mode 100644 (file)
index 0000000..6a26bfd
--- /dev/null
@@ -0,0 +1,49 @@
+/**************************************************************************
+ * 
+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+ /*
+  * Authors:
+  *   Keith Whitwell <keith@tungstengraphics.com>
+  */
+                   
+#include "st_context.h"
+#include "pipe/p_context.h"
+#include "st_atom.h"
+
+
+static void update_vs( struct st_context *st )
+{
+}
+
+
+const struct st_tracked_state st_update_vs = {
+   .dirty = {
+      .mesa  = 0,
+      .st   = ST_NEW_VERTEX_PROGRAM,
+   },
+   .update = update_vs
+};
index 327b627722fd4e31205b3a72afb9548a6934d825..18061ca69cf7692b6c3455056c7f3fafb0258fd5 100644 (file)
@@ -52,6 +52,7 @@ static void st_bind_program( GLcontext *ctx,
 
    switch (target) {
    case GL_VERTEX_PROGRAM_ARB: 
+      st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
       break;
    case GL_FRAGMENT_PROGRAM_ARB:
       st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
@@ -66,16 +67,23 @@ static struct gl_program *st_new_program( GLcontext *ctx,
    struct st_context *st = st_context(ctx);
 
    switch (target) {
-   case GL_VERTEX_PROGRAM_ARB:
-      return _mesa_init_vertex_program(ctx, 
-                                      CALLOC_STRUCT(gl_vertex_program),
-                                       target, 
-                                      id);
+   case GL_VERTEX_PROGRAM_ARB: {
+      struct st_vertex_program *prog = CALLOC_STRUCT(st_vertex_program);
+
+      prog->id = st->program_id++;
+      prog->dirty = 1;
+
+      return _mesa_init_vertex_program( ctx, 
+                                       &prog->Base,
+                                       target, 
+                                       id );
+   }
 
    case GL_FRAGMENT_PROGRAM_ARB: {
       struct st_fragment_program *prog = CALLOC_STRUCT(st_fragment_program);
 
       prog->id = st->program_id++;
+      prog->dirty = 1;
 
       return _mesa_init_fragment_program( ctx, 
                                          &prog->Base,
@@ -106,40 +114,25 @@ static void st_program_string_notify( GLcontext *ctx,
                                      GLenum target,
                                      struct gl_program *prog )
 {
-   if (target == GL_FRAGMENT_PROGRAM_ARB) {
-      struct st_context *st = st_context(ctx);
+   struct st_context *st = st_context(ctx);
 
-      if (prog == &st->ctx->FragmentProgram._Current->Base) 
-      {
-        struct st_fragment_program *p = 
-           (struct st_fragment_program *) prog;
+   if (target == GL_FRAGMENT_PROGRAM_ARB) {
+      struct st_fragment_program *p = (struct st_fragment_program *)prog;
 
+      if (prog == &ctx->FragmentProgram._Current->Base)
         st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
 
-        p->id = st->program_id++;
-#if 0
-        p->param_state = p->Base.Base.Parameters->StateFlags; 
-        p->translated = 0;
-#endif
-
-        /* Gack! do this in the compiler: 
-         */
-        if (p->Base.FogOption) {
-           /* add extra instructions to do fog, then turn off FogOption field */
-           _mesa_append_fog_code(ctx, &p->Base);
-           p->Base.FogOption = GL_NONE;
-        }
-
-         /* XXX: Not hooked-up yet. */
-        {
-           struct tgsi_token tokens[1024];
-
-           tgsi_mesa_compile_fp_program( prog, tokens, 1024 );
-           tgsi_dump( tokens, TGSI_DUMP_VERBOSE );
-        }
-      }
+      p->id = st->program_id++;      
+      p->param_state = p->Base.Base.Parameters->StateFlags;
    }
    else if (target == GL_VERTEX_PROGRAM_ARB) {
+      struct st_vertex_program *p = (struct st_vertex_program *)prog;
+
+      if (prog == &ctx->VertexProgram._Current->Base)
+        st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
+
+      p->id = st->program_id++;      
+      p->param_state = p->Base.Base.Parameters->StateFlags;
 
       /* Also tell tnl about it:
        */
index c1d868604cfe3972b0db9fc6669cd8505ad8b35e..ef3cdb3b0915251a723b1ad464f874ac17654d22 100644 (file)
@@ -40,6 +40,7 @@ struct st_fragment_program;
 
 #define ST_NEW_MESA                    0x1 /* Mesa state has changed */
 #define ST_NEW_FRAGMENT_PROGRAM        0x2
+#define ST_NEW_VERTEX_PROGRAM          0x4
 
 struct st_state_flags {
    GLuint mesa;
index a47059d7a69c80374dd6bb293fcfc1421f078b64..b28887946d59b7515fa6357afe473ba617892912 100644 (file)
 #ifndef ST_PROGRAM_H
 #define ST_PROGRAM_H
 
+#include "mtypes.h"
+#include "pipe/tgsi/core/tgsi_token.h"
+
+#define ST_FP_MAX_TOKENS 1024
+
+
 struct st_fragment_program
 {
    struct gl_fragment_program Base;
@@ -43,6 +49,11 @@ struct st_fragment_program
                                 * ProgramStringNotify changes.
                                 */
 
+
+   struct tgsi_token tokens[ST_FP_MAX_TOKENS];
+   GLboolean dirty;
+   
+
 #if 0   
    GLfloat (*cbuffer)[4];
    GLuint nr_constants;
@@ -56,13 +67,38 @@ struct st_fragment_program
       const GLfloat *values;    /* Pointer to tracked values */
    } *param;
    GLuint nr_params;
+#endif
 
    GLuint param_state;
-#endif
 };
 
 
+struct st_vertex_program
+{
+   struct gl_vertex_program Base;
+   GLboolean error;             /* If program is malformed for any reason. */
+
+   GLuint    id;               /* String id, for tracking
+                                * ProgramStringNotify changes.
+                                */
+
+   GLboolean dirty;
+   GLuint param_state;
+};
+
 void st_init_cb_program( struct st_context *st );
 void st_destroy_cb_program( struct st_context *st );
 
+static inline struct st_fragment_program *
+st_fragment_program( struct gl_fragment_program *fp )
+{
+   return (struct st_fragment_program *)fp;
+}
+
+static inline struct st_vertex_program *
+st_vertex_program( struct gl_vertex_program *vp )
+{
+   return (struct st_vertex_program *)vp;
+}
+
 #endif