glsl: add EXT_clip_cull_distance support based on ARB_cull_distance
authorIlia Mirkin <imirkin@alum.mit.edu>
Tue, 24 May 2016 01:38:38 +0000 (21:38 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Tue, 24 May 2016 02:22:06 +0000 (22:22 -0400)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/compiler/glsl/builtin_variables.cpp
src/compiler/glsl/glsl_parser_extras.cpp
src/compiler/glsl/glsl_parser_extras.h
src/compiler/glsl/linker.cpp
src/mesa/main/extensions_table.h

index ff8a7e2db5e96b3d73ae4de8161f3de8881a20ad..c6668e86517e2297558027ed3983f91ba24d4b1a 100644 (file)
@@ -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);
+   }
+   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) {
       add_const("gl_MaxCullDistances", state->Const.MaxClipPlanes);
       add_const("gl_MaxCombinedClipAndCullDistances",
                 state->Const.MaxClipPlanes);
@@ -1250,11 +1253,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");
    }
index 1d0110b0770d22507888ebe853bc5498e84420ff..1d9b4c56808f4186766f5a3fcf2c87738aa72986 100644 (file)
@@ -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_gpu_shader5,                false, true,      ARB_gpu_shader5),
    EXT(EXT_separate_shader_objects,    false, true,      dummy_true),
    EXT(EXT_shader_integer_mix,         true,  true,      EXT_shader_integer_mix),
index aaf12dddff04c114e71c5a4167f40240fe490d88..3ae3c82a70d8cb2f9c282f92414a993ad65bdf3f 100644 (file)
@@ -639,6 +639,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_gpu_shader5_enable;
index 3d95540256c49d92f4bf842f30aee917b2b8e8d0..81a683e9423bc169219bd953315fac947ab58a81 100644 (file)
@@ -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);
 
@@ -685,20 +684,26 @@ analyze_clip_cull_usage(struct gl_shader_program *prog,
        * a program to statically read or write both gl_ClipVertex and either
        * gl_ClipDistance or gl_CullDistance.
        *
-       * This does not apply to GLSL ES shaders, since GLSL ES defines neither
-       * gl_ClipVertex, gl_ClipDistance or gl_CullDistance.
+       * This does not apply to GLSL ES shaders, since GLSL ES doesn't define
+       * gl_ClipVertex.
        */
-      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()) {
index 8bf716351d89e635b19d02ef28ea4cb1088dfc7b..0e78ee7b4c582edbf050ef0ea3ecb7e3fea4cbe4 100644 (file)
@@ -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)