Mesa (glsl2): glsl2: Add a constructor for _mesa_glsl_parse_state

Ian Romanick idr at kemper.freedesktop.org
Wed Jul 21 00:52:48 UTC 2010


Module: Mesa
Branch: glsl2
Commit: 2462a536ea5c98867296905e3da127eba7c7bdff
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2462a536ea5c98867296905e3da127eba7c7bdff

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Sun Jul 18 15:59:43 2010 -0700

glsl2: Add a constructor for _mesa_glsl_parse_state

Coming changes to the handling of built-in functions necessitate this.

---

 src/glsl/Makefile               |    1 +
 src/glsl/glsl_parser_extras.cpp |   41 +++++++++++++++++++++++++++++++++++++++
 src/glsl/glsl_parser_extras.h   |   22 ++++++++++++++++++++
 src/mesa/shader/ir_to_mesa.cpp  |   34 +------------------------------
 4 files changed, 66 insertions(+), 32 deletions(-)

diff --git a/src/glsl/Makefile b/src/glsl/Makefile
index 7bf95fb..2b04037 100644
--- a/src/glsl/Makefile
+++ b/src/glsl/Makefile
@@ -93,6 +93,7 @@ INCLUDES = \
 	-I../mesa \
 	-I../mapi \
 	-I../mesa/shader \
+	-I../../include \
 	$(LIBRARY_INCLUDES)
 
 ALL_SOURCES = \
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index cb7b6d3..bcf2579 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -34,6 +34,47 @@ extern "C" {
 #include "glsl_parser_extras.h"
 #include "glsl_parser.h"
 
+_mesa_glsl_parse_state::_mesa_glsl_parse_state(struct __GLcontextRec *ctx,
+					       GLenum target, void *mem_ctx)
+{
+   switch (target) {
+   case GL_VERTEX_SHADER:   this->target = vertex_shader; break;
+   case GL_FRAGMENT_SHADER: this->target = fragment_shader; break;
+   case GL_GEOMETRY_SHADER: this->target = geometry_shader; break;
+   }
+
+   this->scanner = NULL;
+   this->translation_unit.make_empty();
+   this->symbols = new(mem_ctx) glsl_symbol_table;
+   this->info_log = talloc_strdup(mem_ctx, "");
+   this->error = false;
+   this->loop_or_switch_nesting = NULL;
+   this->ARB_texture_rectangle_enable = true;
+
+   if (ctx != NULL) {
+      this->extensions = &ctx->Extensions;
+
+      this->Const.MaxLights = ctx->Const.MaxLights;
+      this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes;
+      this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits;
+      this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits;
+      this->Const.MaxVertexAttribs = ctx->Const.VertexProgram.MaxAttribs;
+      this->Const.MaxVertexUniformComponents = ctx->Const.VertexProgram.MaxUniformComponents;
+      this->Const.MaxVaryingFloats = ctx->Const.MaxVarying * 4;
+      this->Const.MaxVertexTextureImageUnits = ctx->Const.MaxVertexTextureImageUnits;
+      this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits;
+      this->Const.MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits;
+      this->Const.MaxFragmentUniformComponents = ctx->Const.FragmentProgram.MaxUniformComponents;
+
+      this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
+   } else {
+      static struct gl_extensions null_extensions;
+
+      memset(&null_extensions, 0, sizeof(null_extensions));
+      this->extensions = &null_extensions;
+   }
+}
+
 const char *
 _mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target)
 {
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index fed6e8c..e2efbd9 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -35,7 +35,29 @@ enum _mesa_glsl_parser_targets {
    ir_shader
 };
 
+struct __GLcontextRec;
+
 struct _mesa_glsl_parse_state {
+   _mesa_glsl_parse_state(struct __GLcontextRec *ctx, GLenum target,
+			  void *mem_ctx);
+
+   /* Callers of this talloc-based new need not call delete. It's
+    * easier to just talloc_free 'ctx' (or any of its ancestors). */
+   static void* operator new(size_t size, void *ctx)
+   {
+      void *mem = talloc_zero_size(ctx, size);
+      assert(mem != NULL);
+
+      return mem;
+   }
+
+   /* If the user *does* call delete, that's OK, we will just
+    * talloc_free in that case. */
+   static void operator delete(void *mem)
+   {
+      talloc_free(mem);
+   }
+
    void *scanner;
    exec_list translation_unit;
    glsl_symbol_table *symbols;
diff --git a/src/mesa/shader/ir_to_mesa.cpp b/src/mesa/shader/ir_to_mesa.cpp
index 7cc469f..1a9b0e3 100644
--- a/src/mesa/shader/ir_to_mesa.cpp
+++ b/src/mesa/shader/ir_to_mesa.cpp
@@ -2155,38 +2155,8 @@ steal_memory(ir_instruction *ir, void *new_ctx)
 void
 _mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader)
 {
-   struct _mesa_glsl_parse_state *state;
-
-   state = talloc_zero(shader, struct _mesa_glsl_parse_state);
-   switch (shader->Type) {
-   case GL_VERTEX_SHADER:   state->target = vertex_shader; break;
-   case GL_FRAGMENT_SHADER: state->target = fragment_shader; break;
-   case GL_GEOMETRY_SHADER: state->target = geometry_shader; break;
-   }
-
-   state->scanner = NULL;
-   state->translation_unit.make_empty();
-   state->symbols = new(shader) glsl_symbol_table;
-   state->info_log = talloc_strdup(shader, "");
-   state->error = false;
-   state->loop_or_switch_nesting = NULL;
-   state->ARB_texture_rectangle_enable = true;
-
-   state->extensions = &ctx->Extensions;
-
-   state->Const.MaxLights = ctx->Const.MaxLights;
-   state->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes;
-   state->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits;
-   state->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits;
-   state->Const.MaxVertexAttribs = ctx->Const.VertexProgram.MaxAttribs;
-   state->Const.MaxVertexUniformComponents = ctx->Const.VertexProgram.MaxUniformComponents;
-   state->Const.MaxVaryingFloats = ctx->Const.MaxVarying * 4;
-   state->Const.MaxVertexTextureImageUnits = ctx->Const.MaxVertexTextureImageUnits;
-   state->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits;
-   state->Const.MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits;
-   state->Const.MaxFragmentUniformComponents = ctx->Const.FragmentProgram.MaxUniformComponents;
-
-   state->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
+   struct _mesa_glsl_parse_state *state =
+      new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader);
 
    const char *source = shader->Source;
    state->error = preprocess(state, &source, &state->info_log,




More information about the mesa-commit mailing list