Merge remote branch 'origin/master' into glsl2
[mesa.git] / src / mesa / main / shaderobj.c
index d4d2349d4b60c7619c7c4b6dce06a31d598efc1d..129d97422471a581dc0010c981e7df9dc7adeea1 100644 (file)
 
 #include "main/glheader.h"
 #include "main/context.h"
-#include "main/dispatch.h"
 #include "main/hash.h"
 #include "main/shaderobj.h"
 #include "program/program.h"
 #include "program/prog_parameter.h"
 #include "program/prog_uniform.h"
-
+#include "talloc.h"
 
 /**********************************************************************/
 /*** Shader object functions                                        ***/
@@ -93,12 +92,13 @@ _mesa_reference_shader(GLcontext *ctx, struct gl_shader **ptr,
  * Allocate a new gl_shader object, initialize it.
  * Called via ctx->Driver.NewShader()
  */
-static struct gl_shader *
+struct gl_shader *
 _mesa_new_shader(GLcontext *ctx, GLuint name, GLenum type)
 {
    struct gl_shader *shader;
-   assert(type == GL_FRAGMENT_SHADER || type == GL_VERTEX_SHADER);
-   shader = CALLOC_STRUCT(gl_shader);
+   assert(type == GL_FRAGMENT_SHADER || type == GL_VERTEX_SHADER ||
+          type == GL_GEOMETRY_SHADER_ARB);
+   shader = talloc_zero(NULL, struct gl_shader);
    if (shader) {
       shader->Type = type;
       shader->Name = name;
@@ -117,10 +117,8 @@ __mesa_delete_shader(GLcontext *ctx, struct gl_shader *sh)
 {
    if (sh->Source)
       free((void *) sh->Source);
-   if (sh->InfoLog)
-      free(sh->InfoLog);
    _mesa_reference_program(ctx, &sh->Program, NULL);
-   free(sh);
+   talloc_free(sh);
 }
 
 
@@ -235,12 +233,17 @@ static struct gl_shader_program *
 _mesa_new_shader_program(GLcontext *ctx, GLuint name)
 {
    struct gl_shader_program *shProg;
-   shProg = CALLOC_STRUCT(gl_shader_program);
+   shProg = talloc_zero(NULL, struct gl_shader_program);
    if (shProg) {
       shProg->Type = GL_SHADER_PROGRAM_MESA;
       shProg->Name = name;
       shProg->RefCount = 1;
       shProg->Attributes = _mesa_new_parameter_list();
+#if FEATURE_ARB_geometry_shader4
+      shProg->Geom.VerticesOut = 0;
+      shProg->Geom.InputType = GL_TRIANGLES;
+      shProg->Geom.OutputType = GL_TRIANGLE_STRIP;
+#endif
    }
    return shProg;
 }
@@ -255,6 +258,7 @@ _mesa_clear_shader_program_data(GLcontext *ctx,
 {
    _mesa_reference_vertprog(ctx, &shProg->VertexProgram, NULL);
    _mesa_reference_fragprog(ctx, &shProg->FragmentProgram, NULL);
+   _mesa_reference_geomprog(ctx, &shProg->GeometryProgram, NULL);
 
    if (shProg->Uniforms) {
       _mesa_free_uniform_list(shProg->Uniforms);
@@ -299,7 +303,7 @@ _mesa_free_shader_program_data(GLcontext *ctx,
    }
 
    if (shProg->InfoLog) {
-      free(shProg->InfoLog);
+      talloc_free(shProg->InfoLog);
       shProg->InfoLog = NULL;
    }
 
@@ -322,7 +326,7 @@ __mesa_delete_shader_program(GLcontext *ctx, struct gl_shader_program *shProg)
 {
    _mesa_free_shader_program_data(ctx, shProg);
 
-   free(shProg);
+   talloc_free(shProg);
 }