glsl: Add basic ARB_gpu_shader_int64 types
[mesa.git] / src / compiler / glsl / glsl_parser.yy
index 09b7e79c40baa9cee0785ef95d884ee13cb97a00..734dc499cca2de0a87d6999ff0ed1ca1ce2e53f3 100644 (file)
@@ -136,6 +136,7 @@ static bool match_layout_qualifier(const char *s1, const char *s2,
 %token ATTRIBUTE CONST_TOK BOOL_TOK FLOAT_TOK INT_TOK UINT_TOK DOUBLE_TOK
 %token BREAK BUFFER CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT
 %token BVEC2 BVEC3 BVEC4 IVEC2 IVEC3 IVEC4 UVEC2 UVEC3 UVEC4 VEC2 VEC3 VEC4 DVEC2 DVEC3 DVEC4
+%token INT64 UINT64 I64VEC2 I64VEC3 I64VEC4 U64VEC2 U64VEC3 U64VEC4
 %token CENTROID IN_TOK OUT_TOK INOUT_TOK UNIFORM VARYING SAMPLE
 %token NOPERSPECTIVE FLAT SMOOTH
 %token MAT2X2 MAT2X3 MAT2X4
@@ -1372,9 +1373,10 @@ layout_qualifier_id:
                }
             }
          }
+      }
 
-         if (!$$.flags.i &&
-             match_layout_qualifier($1, "early_fragment_tests", state) == 0) {
+      if (!$$.flags.i) {
+         if (match_layout_qualifier($1, "early_fragment_tests", state) == 0) {
             /* From section 4.4.1.3 of the GLSL 4.50 specification
              * (Fragment Shader Inputs):
              *
@@ -1393,15 +1395,32 @@ layout_qualifier_id:
             $$.flags.q.early_fragment_tests = 1;
          }
 
-         if (!$$.flags.i &&
-             match_layout_qualifier($1, "post_depth_coverage", state) == 0) {
+         if (match_layout_qualifier($1, "inner_coverage", state) == 0) {
+            if (state->stage != MESA_SHADER_FRAGMENT) {
+               _mesa_glsl_error(& @1, state,
+                                "inner_coverage layout qualifier only "
+                                "valid in fragment shaders");
+            }
+
+           if (state->INTEL_conservative_rasterization_enable) {
+              $$.flags.q.inner_coverage = 1;
+           } else {
+              _mesa_glsl_error(& @1, state,
+                                "inner_coverage layout qualifier present, "
+                                "but the INTEL_conservative_rasterization extension "
+                                "is not enabled.");
+            }
+         }
+
+         if (match_layout_qualifier($1, "post_depth_coverage", state) == 0) {
             if (state->stage != MESA_SHADER_FRAGMENT) {
                _mesa_glsl_error(& @1, state,
                                 "post_depth_coverage layout qualifier only "
                                 "valid in fragment shaders");
             }
 
-            if (state->ARB_post_depth_coverage_enable) {
+            if (state->ARB_post_depth_coverage_enable ||
+               state->INTEL_conservative_rasterization_enable) {
                $$.flags.q.post_depth_coverage = 1;
             } else {
                _mesa_glsl_error(& @1, state,
@@ -1410,6 +1429,12 @@ layout_qualifier_id:
                                 "is not enabled.");
             }
          }
+
+         if ($$.flags.q.post_depth_coverage && $$.flags.q.inner_coverage) {
+            _mesa_glsl_error(& @1, state,
+                             "post_depth_coverage & inner_coverage layout qualifiers "
+                             "are mutually exclusive");
+         }
       }
 
       /* Layout qualifiers for tessellation evaluation shaders. */
@@ -1439,11 +1464,11 @@ layout_qualifier_id:
       if (!$$.flags.i) {
          static const struct {
             const char *s;
-            GLenum e;
+            enum gl_tess_spacing e;
          } map[] = {
-                 { "equal_spacing", GL_EQUAL },
-                 { "fractional_odd_spacing", GL_FRACTIONAL_ODD },
-                 { "fractional_even_spacing", GL_FRACTIONAL_EVEN },
+                 { "equal_spacing", TESS_SPACING_EQUAL },
+                 { "fractional_odd_spacing", TESS_SPACING_FRACTIONAL_ODD },
+                 { "fractional_even_spacing", TESS_SPACING_FRACTIONAL_EVEN },
          };
          for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
             if (match_layout_qualifier($1, map[i].s, state) == 0) {
@@ -2280,6 +2305,14 @@ basic_type_specifier_nonarray:
    | UIMAGE2DMS             { $$ = "uimage2DMS"; }
    | UIMAGE2DMSARRAY        { $$ = "uimage2DMSArray"; }
    | ATOMIC_UINT            { $$ = "atomic_uint"; }
+   | INT64                  { $$ = "int64_t";     }
+   | I64VEC2                { $$ = "i64vec2";     }
+   | I64VEC3                { $$ = "i64vec3";     }
+   | I64VEC4                { $$ = "i64vec4";     }
+   | UINT64                 { $$ = "uint64_t";    }
+   | U64VEC2                { $$ = "u64vec2";     }
+   | U64VEC3                { $$ = "u64vec3";     }
+   | U64VEC4                { $$ = "u64vec4";     }
    ;
 
 precision_qualifier: