glsl: add support for GL_OES_geometry_shader
authorMarta Lofstedt <marta.lofstedt@intel.com>
Thu, 21 Jan 2016 15:17:31 +0000 (16:17 +0100)
committerMarta Lofstedt <marta.lofstedt@linux.intel.com>
Fri, 22 Jan 2016 16:13:55 +0000 (17:13 +0100)
This adds glsl support of GL_OES_geometry_shader for
OpenGL ES 3.1.

Signed-off-by: Marta Lofstedt <marta.lofstedt@linux.intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/glsl/builtin_variables.cpp
src/glsl/glsl_parser.yy
src/glsl/glsl_parser_extras.cpp
src/glsl/glsl_parser_extras.h

index 221aab0043b34ee72756bae74f93628a4a6355c6..ccc04c00ceae830ce001bdac7e9e1934d16116e1 100644 (file)
@@ -667,7 +667,7 @@ builtin_variable_generator::generate_constants()
       add_const("gl_MaxVaryingComponents", state->ctx->Const.MaxVarying * 4);
    }
 
-   if (state->is_version(150, 0)) {
+   if (state->has_geometry_shader()) {
       add_const("gl_MaxVertexOutputComponents",
                 state->Const.MaxVertexOutputComponents);
       add_const("gl_MaxGeometryInputComponents",
@@ -730,12 +730,11 @@ builtin_variable_generator::generate_constants()
       add_const("gl_MaxAtomicCounterBindings",
                 state->Const.MaxAtomicBufferBindings);
 
-      /* When Mesa adds support for GL_OES_geometry_shader and
-       * GL_OES_tessellation_shader, this will need to change.
-       */
-      if (!state->es_shader) {
+      if (state->has_geometry_shader()) {
          add_const("gl_MaxGeometryAtomicCounters",
                    state->Const.MaxGeometryAtomicCounters);
+      }
+      if (!state->es_shader) {
          add_const("gl_MaxTessControlAtomicCounters",
                    state->Const.MaxTessControlAtomicCounters);
          add_const("gl_MaxTessEvaluationAtomicCounters",
@@ -753,12 +752,11 @@ builtin_variable_generator::generate_constants()
       add_const("gl_MaxAtomicCounterBufferSize",
                 state->Const.MaxAtomicCounterBufferSize);
 
-      /* When Mesa adds support for GL_OES_geometry_shader and
-       * GL_OES_tessellation_shader, this will need to change.
-       */
-      if (!state->es_shader) {
+      if (state->has_geometry_shader()) {
          add_const("gl_MaxGeometryAtomicCounterBuffers",
                    state->Const.MaxGeometryAtomicCounterBuffers);
+      }
+      if (!state->es_shader) {
          add_const("gl_MaxTessControlAtomicCounterBuffers",
                    state->Const.MaxTessControlAtomicCounterBuffers);
          add_const("gl_MaxTessEvaluationAtomicCounterBuffers",
@@ -814,13 +812,16 @@ builtin_variable_generator::generate_constants()
       add_const("gl_MaxCombinedImageUniforms",
                 state->Const.MaxCombinedImageUniforms);
 
+      if (state->has_geometry_shader()) {
+         add_const("gl_MaxGeometryImageUniforms",
+                   state->Const.MaxGeometryImageUniforms);
+      }
+
       if (!state->es_shader) {
          add_const("gl_MaxCombinedImageUnitsAndFragmentOutputs",
                    state->Const.MaxCombinedShaderOutputResources);
          add_const("gl_MaxImageSamples",
                    state->Const.MaxImageSamples);
-         add_const("gl_MaxGeometryImageUniforms",
-                   state->Const.MaxGeometryImageUniforms);
       }
 
       if (state->is_version(450, 310)) {
@@ -1070,7 +1071,7 @@ builtin_variable_generator::generate_fs_special_vars()
    if (state->is_version(120, 100))
       add_input(VARYING_SLOT_PNTC, vec2_t, "gl_PointCoord");
 
-   if (state->is_version(150, 0)) {
+   if (state->has_geometry_shader()) {
       var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
       var->data.interpolation = INTERP_QUALIFIER_FLAT;
    }
index 1019875894473db88e9ea3ca7fe628390fa04476..2109fb2eeddfd239ff513477ab7f91bbfe7a175c 100644 (file)
@@ -1270,7 +1270,7 @@ layout_qualifier_id:
             }
          }
 
-         if ($$.flags.i && !state->is_version(150, 0)) {
+         if ($$.flags.i && !state->has_geometry_shader()) {
             _mesa_glsl_error(& @1, state, "#version 150 layout "
                              "qualifier `%s' used", $1);
          }
@@ -1507,7 +1507,7 @@ layout_qualifier_id:
       if (match_layout_qualifier("max_vertices", $1, state) == 0) {
          $$.flags.q.max_vertices = 1;
          $$.max_vertices = new(ctx) ast_layout_expression(@1, $3);
-         if (!state->is_version(150, 0)) {
+         if (!state->has_geometry_shader()) {
             _mesa_glsl_error(& @3, state,
                              "#version 150 max_vertices qualifier "
                              "specified", $3);
index 1d74db5486949a93278e38d89c1bb8a5c437813d..603895497d12e645a380fc5822f2d791b2b999a0 100644 (file)
@@ -598,6 +598,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
    /* OES extensions go here, sorted alphabetically.
     */
    EXT(OES_EGL_image_external,         false, true,      OES_EGL_image_external),
+   EXT(OES_geometry_shader,            false, true,      OES_geometry_shader),
    EXT(OES_standard_derivatives,       false, true,      OES_standard_derivatives),
    EXT(OES_texture_3D,                 false, true,      dummy_true),
    EXT(OES_texture_storage_multisample_2d_array, false, true, ARB_texture_multisample),
index ecc299209180797ed271c4fa69d807f16acd6c11..3f88e01d5999f3d93af50281b27cadcaae0c8dbb 100644 (file)
@@ -265,6 +265,11 @@ struct _mesa_glsl_parse_state {
       return ARB_compute_shader_enable || is_version(430, 310);
    }
 
+   bool has_geometry_shader() const
+   {
+      return OES_geometry_shader_enable || is_version(150, 320);
+   }
+
    void process_version_directive(YYLTYPE *locp, int version,
                                   const char *ident);
 
@@ -586,6 +591,8 @@ struct _mesa_glsl_parse_state {
     */
    bool OES_EGL_image_external_enable;
    bool OES_EGL_image_external_warn;
+   bool OES_geometry_shader_enable;
+   bool OES_geometry_shader_warn;
    bool OES_standard_derivatives_enable;
    bool OES_standard_derivatives_warn;
    bool OES_texture_3D_enable;