OSDN Git Service

glsl: add builtins for geometry shaders.
authorBryan Cain <bryancain3@gmail.com>
Fri, 15 Feb 2013 14:53:20 +0000 (08:53 -0600)
committerPaul Berry <stereotype441@gmail.com>
Fri, 2 Aug 2013 03:20:36 +0000 (20:20 -0700)
v2 (Paul Berry <stereotype441@gmail.com>): Account for rework of
builtin_variables.cpp.  Use INTERP_QUALIFIER_FLAT for gl_PrimitiveID
so that it will obey provoking vertex conventions.  Convert to GLSL
1.50 style geometry shaders.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
v3 (Paul Berry <stereotype441@gmail.com>): Be less obscure about
setting interpolation field of gl_Primitive variables.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/builtin_variables.cpp
src/glsl/builtins/ir/EmitVertex.ir [new file with mode: 0644]
src/glsl/builtins/ir/EndPrimitive.ir [new file with mode: 0644]
src/glsl/builtins/profiles/150.geom [new file with mode: 0644]
src/glsl/builtins/tools/generate_builtins.py

index 1e88b6a..6a808c0 100644 (file)
@@ -686,8 +686,11 @@ builtin_variable_generator::generate_gs_special_vars()
     * the specific case of gl_PrimitiveIDIn.  So we don't need to treat
     * gl_PrimitiveIDIn as an {ARB,EXT}_geometry_shader4-only variable.
     */
-   add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveIDIn");
-   add_output(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
+   ir_variable *var;
+   var = add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveIDIn");
+   var->interpolation = INTERP_QUALIFIER_FLAT;
+   var = add_output(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
+   var->interpolation = INTERP_QUALIFIER_FLAT;
 }
 
 
@@ -702,6 +705,12 @@ 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)) {
+      ir_variable *var =
+         add_input(VARYING_SLOT_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
+      var->interpolation = INTERP_QUALIFIER_FLAT;
+   }
+
    /* gl_FragColor and gl_FragData were deprecated starting in desktop GLSL
     * 1.30, and were relegated to the compatibility profile in GLSL 4.20.
     * They were removed from GLSL ES 3.00.
diff --git a/src/glsl/builtins/ir/EmitVertex.ir b/src/glsl/builtins/ir/EmitVertex.ir
new file mode 100644 (file)
index 0000000..8ffb6c4
--- /dev/null
@@ -0,0 +1,5 @@
+((function EmitVertex
+  (signature void
+    (parameters)
+    ((emit-vertex)))
+))
diff --git a/src/glsl/builtins/ir/EndPrimitive.ir b/src/glsl/builtins/ir/EndPrimitive.ir
new file mode 100644 (file)
index 0000000..ed7e12a
--- /dev/null
@@ -0,0 +1,5 @@
+((function EndPrimitive
+  (signature void
+    (parameters)
+    ((end-primitive)))
+))
diff --git a/src/glsl/builtins/profiles/150.geom b/src/glsl/builtins/profiles/150.geom
new file mode 100644 (file)
index 0000000..d2ab891
--- /dev/null
@@ -0,0 +1,3 @@
+#version 150
+void EmitVertex();
+void EndPrimitive();
index 85bd5dd..54c5a49 100755 (executable)
@@ -125,7 +125,7 @@ def write_profiles():
 
 def get_profile_list():
     profile_files = []
-    for extension in ['glsl', 'frag', 'vert']:
+    for extension in ['glsl', 'frag', 'vert', 'geom']:
         path_glob = path.join(
             path.join(builtins_dir, 'profiles'), '*.' + extension)
         profile_files.extend(glob(path_glob))
@@ -279,10 +279,12 @@ _mesa_glsl_initialize_functions(struct _mesa_glsl_parse_state *state)
             check = 'state->target == vertex_shader && '
         elif profile.endswith('_frag'):
             check = 'state->target == fragment_shader && '
+        elif profile.endswith('_geom'):
+            check = 'state->target == geometry_shader && '
         else:
             check = ''
 
-        version = re.sub(r'_(glsl|vert|frag)$', '', profile)
+        version = re.sub(r'_(glsl|vert|frag|geom)$', '', profile)
         if version[0].isdigit():
             is_es = version.endswith('es')
             if is_es: