st/mesa: fix InternalFormat for Z24X8 window-system buffers
[mesa.git] / src / mesa / state_tracker / st_cb_program.c
index 3e217abbb2e6d6a9daaa9dcbe0793b9e94955714..e7732bdbd8e4c43d565409d416a870b6cc2cfb40 100644 (file)
@@ -44,6 +44,7 @@
 #include "st_program.h"
 #include "st_mesa_to_tgsi.h"
 #include "st_cb_program.h"
+#include "st_glsl_to_tgsi.h"
 
 
 
@@ -98,8 +99,7 @@ st_new_program(struct gl_context *ctx, GLenum target, GLuint id)
       return _mesa_init_vertex_program(ctx, &prog->Base, target, id);
    }
 
-   case GL_FRAGMENT_PROGRAM_ARB:
-   case GL_FRAGMENT_PROGRAM_NV: {
+   case GL_FRAGMENT_PROGRAM_ARB: {
       struct st_fragment_program *prog = ST_CALLOC_STRUCT(st_fragment_program);
       return _mesa_init_fragment_program(ctx, &prog->Base, target, id);
    }
@@ -119,7 +119,7 @@ st_new_program(struct gl_context *ctx, GLenum target, GLuint id)
 /**
  * Called via ctx->Driver.DeleteProgram()
  */
-void
+static void
 st_delete_program(struct gl_context *ctx, struct gl_program *prog)
 {
    struct st_context *st = st_context(ctx);
@@ -128,7 +128,10 @@ st_delete_program(struct gl_context *ctx, struct gl_program *prog)
    case GL_VERTEX_PROGRAM_ARB:
       {
          struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
-         st_vp_release_varients( st, stvp );
+         st_release_vp_variants( st, stvp );
+         
+         if (stvp->glsl_to_tgsi)
+            free_glsl_to_tgsi_visitor(stvp->glsl_to_tgsi);
       }
       break;
    case MESA_GEOMETRY_PROGRAM:
@@ -136,7 +139,10 @@ st_delete_program(struct gl_context *ctx, struct gl_program *prog)
          struct st_geometry_program *stgp =
             (struct st_geometry_program *) prog;
 
-         st_gp_release_varients(st, stgp);
+         st_release_gp_variants(st, stgp);
+         
+         if (stgp->glsl_to_tgsi)
+            free_glsl_to_tgsi_visitor(stgp->glsl_to_tgsi);
 
          if (stgp->tgsi.tokens) {
             st_free_tokens((void *) stgp->tgsi.tokens);
@@ -149,12 +155,10 @@ st_delete_program(struct gl_context *ctx, struct gl_program *prog)
          struct st_fragment_program *stfp =
             (struct st_fragment_program *) prog;
 
-         st_fp_release_varients(st, stfp);
+         st_release_fp_variants(st, stfp);
          
-         if (stfp->tgsi.tokens) {
-            st_free_tokens(stfp->tgsi.tokens);
-            stfp->tgsi.tokens = NULL;
-         }
+         if (stfp->glsl_to_tgsi)
+            free_glsl_to_tgsi_visitor(stfp->glsl_to_tgsi);
       }
       break;
    default:
@@ -181,7 +185,7 @@ st_is_program_native(struct gl_context *ctx,
 /**
  * Called via ctx->Driver.ProgramStringNotify()
  * Called when the program's text/code is changed.  We have to free
- * all shader varients and corresponding gallium shaders when this happens.
+ * all shader variants and corresponding gallium shaders when this happens.
  */
 static GLboolean
 st_program_string_notify( struct gl_context *ctx,
@@ -193,12 +197,7 @@ st_program_string_notify( struct gl_context *ctx,
    if (target == GL_FRAGMENT_PROGRAM_ARB) {
       struct st_fragment_program *stfp = (struct st_fragment_program *) prog;
 
-      st_fp_release_varients(st, stfp);
-
-      if (stfp->tgsi.tokens) {
-         st_free_tokens(stfp->tgsi.tokens);
-         stfp->tgsi.tokens = NULL;
-      }
+      st_release_fp_variants(st, stfp);
 
       if (st->fp == stfp)
         st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
@@ -206,7 +205,7 @@ st_program_string_notify( struct gl_context *ctx,
    else if (target == MESA_GEOMETRY_PROGRAM) {
       struct st_geometry_program *stgp = (struct st_geometry_program *) prog;
 
-      st_gp_release_varients(st, stgp);
+      st_release_gp_variants(st, stgp);
 
       if (stgp->tgsi.tokens) {
          st_free_tokens((void *) stgp->tgsi.tokens);
@@ -219,7 +218,7 @@ st_program_string_notify( struct gl_context *ctx,
    else if (target == GL_VERTEX_PROGRAM_ARB) {
       struct st_vertex_program *stvp = (struct st_vertex_program *) prog;
 
-      st_vp_release_varients( st, stvp );
+      st_release_vp_variants( st, stvp );
 
       if (st->vp == stvp)
         st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
@@ -242,4 +241,8 @@ st_init_program_functions(struct dd_function_table *functions)
    functions->DeleteProgram = st_delete_program;
    functions->IsProgramNative = st_is_program_native;
    functions->ProgramStringNotify = st_program_string_notify;
+   
+   functions->NewShader = st_new_shader;
+   functions->NewShaderProgram = st_new_shader_program;
+   functions->LinkShader = st_link_shader;
 }