On 07/08/2014 12:29 PM, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

This is needed to make Unigine Heaven 4.0 and Unigine Valley 1.0 work
with sample shading.

Also, if this is disabled, the error message at least makes sense now.
---
  src/glsl/glsl_parser.yy         | 8 ++++++++
  src/glsl/glsl_parser_extras.cpp | 2 ++
  src/glsl/glsl_parser_extras.h   | 2 ++
  src/mesa/main/mtypes.h          | 5 +++++
  4 files changed, 17 insertions(+)

diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index b989749..4c87163 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -376,6 +376,14 @@ external_declaration_list:
        if ($2 != NULL)
           state->translation_unit.push_tail(& $2->link);
     }
+   | external_declaration_list extension_statement {
+      if (!state->allow_extension_directive_midshader) {
+         _mesa_glsl_error(& @2, state,
+                          "#extension directive is not allowed "
+                          "in the middle of a shader");
+         YYERROR;
+      }
+   }
     ;

  variable_identifier:
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index b327c2b..890123a 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -210,6 +210,8 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct 
gl_context *_ctx,
     this->early_fragment_tests = false;
     memset(this->atomic_counter_offsets, 0,
            sizeof(this->atomic_counter_offsets));
+   this->allow_extension_directive_midshader =
+      ctx->Const.AllowGLSLExtensionDirectiveMidShader;
  }

  /**
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index 1791816..f720d6a 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -490,6 +490,8 @@ struct _mesa_glsl_parse_state {

     /** Atomic counter offsets by binding */
     unsigned atomic_counter_offsets[MAX_COMBINED_ATOMIC_BUFFERS];
+
+   bool allow_extension_directive_midshader;
  };

  # define YYLLOC_DEFAULT(Current, Rhs, N)                      \
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index a7126fd..b42a175 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3349,6 +3349,11 @@ struct gl_constants
     GLuint ForceGLSLVersion;

     /**
+    * Allow GLSL #extension directives in the middle of shaders.
+    */
+   GLboolean AllowGLSLExtensionDirectiveMidShader;
+
+   /**
      * Does the driver support real 32-bit integers?  (Otherwise, integers are
      * simulated via floats.)
      */



For both, Reviewed-by: Brian Paul <bri...@vmware.com>

There was a thread about this a few months ago. Photoshop is another app that has this issue.

-Brian

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to