glsl2: Free the shader compiler at dri screen destruction.
authorEric Anholt <eric@anholt.net>
Wed, 18 Aug 2010 23:56:39 +0000 (16:56 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 19 Aug 2010 00:10:48 +0000 (17:10 -0700)
Hooray, we can valgrind again without adding suppressions.  This also
adds an interface for use by an implementation of
glReleaseShaderCompiler().

src/glsl/glsl_parser_extras.cpp
src/glsl/glsl_parser_extras.h
src/mesa/drivers/dri/common/dri_util.c

index d1bb1ae5ecce29763bbb0b00966252557a62e240..b864218d50d3023afe3815b32594f067a922e0f9 100644 (file)
@@ -741,3 +741,33 @@ do_common_optimization(exec_list *ir, bool linked)
 
    return progress;
 }
+
+extern "C" {
+
+/**
+ * To be called at GL teardown time, this frees compiler datastructures.
+ *
+ * After calling this, any previously compiled shaders and shader
+ * programs would be invalid.  So this should happen at approximately
+ * program exit.
+ */
+void
+_mesa_destroy_shader_compiler(void)
+{
+   _mesa_destroy_shader_compiler_caches();
+
+   _mesa_glsl_release_types();
+}
+
+/**
+ * Releases compiler caches to trade off performance for memory.
+ *
+ * Intended to be used with glReleaseShaderCompiler().
+ */
+void
+_mesa_destroy_shader_compiler_caches(void)
+{
+   _mesa_glsl_release_functions();
+}
+
+}
index 9e3cac26e26f3abd9409f3cc7fd8734e9704b3c3..b0b1bc31d05c5c3cce343b41ddcb0ab782fd5140 100644 (file)
@@ -178,6 +178,9 @@ extern void _mesa_glsl_warning(const YYLTYPE *locp,
 extern "C" {
 extern int preprocess(void *ctx, const char **shader, char **info_log,
                      const struct gl_extensions *extensions);
+
+extern void _mesa_destroy_shader_compiler();
+extern void _mesa_destroy_shader_compiler_caches();
 }
 
 extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
index 5eb8b62f450bf059456be973a397607289975341..b1a7b3ed3428c4f2e17100c12bd267aef28f7f02 100644 (file)
@@ -707,6 +707,8 @@ static void driDestroyScreen(__DRIscreen *psp)
         * stream open to the X-server anymore.
         */
 
+       _mesa_destroy_shader_compiler();
+
        if (psp->DriverAPI.DestroyScreen)
            (*psp->DriverAPI.DestroyScreen)(psp);