On 24.05.2016 03:42, Ilia Mirkin wrote:
Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu>
---
  src/compiler/glsl/builtin_variables.cpp  | 12 +++++++----
  src/compiler/glsl/glsl_parser_extras.cpp |  1 +
  src/compiler/glsl/glsl_parser_extras.h   |  2 ++
  src/compiler/glsl/linker.cpp             | 35 ++++++++++++++++++--------------
  src/mesa/main/extensions_table.h         |  1 +
  5 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/src/compiler/glsl/builtin_variables.cpp 
b/src/compiler/glsl/builtin_variables.cpp
index e899f01..3d34028 100644
--- a/src/compiler/glsl/builtin_variables.cpp
+++ b/src/compiler/glsl/builtin_variables.cpp
@@ -674,11 +674,14 @@ builtin_variable_generator::generate_constants()
                  state->Const.MaxProgramTexelOffset);
     }
- if (state->is_version(130, 0)) {
+   if (state->is_version(130, 0) || state->EXT_clip_cull_distance_enable) {
        add_const("gl_MaxClipDistances", state->Const.MaxClipPlanes);

Add a has_clip_distance() func?

+   }
+   if (state->is_version(130, 0)) {
        add_const("gl_MaxVaryingComponents", state->ctx->Const.MaxVarying * 4);
     }
-   if (state->is_version(450, 0) || state->ARB_cull_distance_enable) {
+   if (state->is_version(450, 0) || state->ARB_cull_distance_enable ||
+       state->EXT_clip_cull_distance_enable) {

For the last series cull series in review, it was noted that a has_cull_distance() func would be nice to for these checks (dave didn't see that i guess). As you are touching it now again, maybe introduce that one, when you are at it :)

Other than that i think you are missing the entry in the parser for:

#extension GL_EXT_clip_cull_distance : <behavior>

Other than that the patch looks fine to me!


        add_const("gl_MaxCullDistances", state->Const.MaxClipPlanes);
        add_const("gl_MaxCombinedClipAndCullDistances",
                  state->Const.MaxClipPlanes);
@@ -1256,11 +1259,12 @@ builtin_variable_generator::generate_varyings()
        }
     }
- if (state->is_version(130, 0)) {
+   if (state->is_version(130, 0) || state->EXT_clip_cull_distance_enable) {
         add_varying(VARYING_SLOT_CLIP_DIST0, array(float_t, 0),
                     "gl_ClipDistance");
     }
-   if (state->is_version(450, 0) || state->ARB_cull_distance_enable) {
+   if (state->is_version(450, 0) || state->ARB_cull_distance_enable ||
+       state->EXT_clip_cull_distance_enable) {
        add_varying(VARYING_SLOT_CULL_DIST0, array(float_t, 0),
                     "gl_CullDistance");
     }
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp 
b/src/compiler/glsl/glsl_parser_extras.cpp
index 2c42016..8b088ca 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -641,6 +641,7 @@ static const _mesa_glsl_extension 
_mesa_glsl_supported_extensions[] = {
     EXT(AMD_vertex_shader_viewport_index, true,  false,   
AMD_vertex_shader_viewport_index),
     EXT(EXT_blend_func_extended,        false,  true,     
ARB_blend_func_extended),
     EXT(EXT_draw_buffers,               false,  true,     dummy_true),
+   EXT(EXT_clip_cull_distance,         false, true,      ARB_cull_distance),
     EXT(EXT_geometry_point_size,        false, true,      OES_geometry_shader),
     EXT(EXT_geometry_shader,            false, true,      OES_geometry_shader),
     EXT(EXT_gpu_shader5,                false, true,      ARB_gpu_shader5),
diff --git a/src/compiler/glsl/glsl_parser_extras.h 
b/src/compiler/glsl/glsl_parser_extras.h
index 59ae972..3afc9cb 100644
--- a/src/compiler/glsl/glsl_parser_extras.h
+++ b/src/compiler/glsl/glsl_parser_extras.h
@@ -641,6 +641,8 @@ struct _mesa_glsl_parse_state {
     bool AMD_vertex_shader_viewport_index_warn;
     bool EXT_blend_func_extended_enable;
     bool EXT_blend_func_extended_warn;
+   bool EXT_clip_cull_distance_enable;
+   bool EXT_clip_cull_distance_warn;
     bool EXT_draw_buffers_enable;
     bool EXT_draw_buffers_warn;
     bool EXT_geometry_point_size_enable;
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index ca2f060..8cf2a95 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -661,7 +661,7 @@ analyze_clip_cull_usage(struct gl_shader_program *prog,
     *clip_distance_array_size = 0;
     *cull_distance_array_size = 0;
- if (!prog->IsES && prog->Version >= 130) {
+   if (prog->Version >= (prog->IsES ? 300 : 130)) {
        /* From section 7.1 (Vertex Shader Special Variables) of the
         * GLSL 1.30 spec:
         *
@@ -669,13 +669,12 @@ analyze_clip_cull_usage(struct gl_shader_program *prog,
         *   gl_ClipVertex and gl_ClipDistance."
         *
         * This does not apply to GLSL ES shaders, since GLSL ES defines neither
-       * gl_ClipVertex nor gl_ClipDistance.
+       * gl_ClipVertex nor gl_ClipDistance. However with
+       * GL_EXT_clip_cull_distance, this functionality is exposed in ES 3.0.
         */
-      find_assignment_visitor clip_vertex("gl_ClipVertex");
        find_assignment_visitor clip_distance("gl_ClipDistance");
        find_assignment_visitor cull_distance("gl_CullDistance");
- clip_vertex.run(shader->ir);
        clip_distance.run(shader->ir);
        cull_distance.run(shader->ir);
@@ -688,17 +687,23 @@ analyze_clip_cull_usage(struct gl_shader_program *prog,
         * This does not apply to GLSL ES shaders, since GLSL ES defines neither
         * gl_ClipVertex, gl_ClipDistance or gl_CullDistance.
         */
-      if (clip_vertex.variable_found() && clip_distance.variable_found()) {
-         linker_error(prog, "%s shader writes to both `gl_ClipVertex' "
-                      "and `gl_ClipDistance'\n",
-                      _mesa_shader_stage_to_string(shader->Stage));
-         return;
-      }
-      if (clip_vertex.variable_found() && cull_distance.variable_found()) {
-         linker_error(prog, "%s shader writes to both `gl_ClipVertex' "
-                      "and `gl_CullDistance'\n",
-                      _mesa_shader_stage_to_string(shader->Stage));
-         return;
+      if (!prog->IsES) {
+         find_assignment_visitor clip_vertex("gl_ClipVertex");
+
+         clip_vertex.run(shader->ir);
+
+         if (clip_vertex.variable_found() && clip_distance.variable_found()) {
+            linker_error(prog, "%s shader writes to both `gl_ClipVertex' "
+                         "and `gl_ClipDistance'\n",
+                         _mesa_shader_stage_to_string(shader->Stage));
+            return;
+         }
+         if (clip_vertex.variable_found() && cull_distance.variable_found()) {
+            linker_error(prog, "%s shader writes to both `gl_ClipVertex' "
+                         "and `gl_CullDistance'\n",
+                         _mesa_shader_stage_to_string(shader->Stage));
+            return;
+         }
        }
if (clip_distance.variable_found()) {
diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
index 296fbd8..716442e 100644
--- a/src/mesa/main/extensions_table.h
+++ b/src/mesa/main/extensions_table.h
@@ -189,6 +189,7 @@ EXT(EXT_blend_func_separate                 , 
EXT_blend_func_separate
  EXT(EXT_blend_minmax                        , EXT_blend_minmax                
       , GLL,  x , ES1, ES2, 1995)
  EXT(EXT_blend_subtract                      , dummy_true                      
       , GLL,  x ,  x ,  x , 1995)
  EXT(EXT_buffer_storage                      , ARB_buffer_storage              
       ,  x ,  x ,  x ,  31, 2015)
+EXT(EXT_clip_cull_distance                  , ARB_cull_distance                
      ,  x ,  x ,  x ,  30, 2016)
  EXT(EXT_color_buffer_float                  , dummy_true                      
       ,  x ,  x , ES1,  30, 2013)
  EXT(EXT_compiled_vertex_array               , dummy_true                      
       , GLL,  x ,  x ,  x , 1996)
  EXT(EXT_copy_image                          , OES_copy_image                  
       ,  x ,  x ,  x ,  30, 2014)

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

Reply via email to