[Piglit] [PATCH 4/6] gen_builtin_uniform_tests.py: Add tessellation control shader tests.
Chris Forbes
chrisf at ijw.co.nz
Fri Aug 22 20:25:10 PDT 2014
From: Fabian Bieler <fabianbieler at fastmail.fm>
Reviewed-by: Chris Forbes <chrisf at ijw.co.nz>
---
generated_tests/gen_builtin_uniform_tests.py | 129 ++++++++++++++++++++++++++-
1 file changed, 125 insertions(+), 4 deletions(-)
diff --git a/generated_tests/gen_builtin_uniform_tests.py b/generated_tests/gen_builtin_uniform_tests.py
index 7edd5cc..b8eceed 100644
--- a/generated_tests/gen_builtin_uniform_tests.py
+++ b/generated_tests/gen_builtin_uniform_tests.py
@@ -357,6 +357,12 @@ class ShaderTest(object):
def glsl_version(self):
return self._signature.version_introduced
+ def extensions(self):
+ ext = []
+ if self._signature.extension:
+ ext.append(self._signature.extension)
+ return ext
+
def draw_command(self):
if self.glsl_version() >= 140:
return 'draw arrays GL_TRIANGLE_FAN 0 4\n'
@@ -380,6 +386,22 @@ class ShaderTest(object):
def make_vertex_shader(self):
"""Return the vertex shader for this test."""
+ def make_tess_ctrl_shader(self):
+ """Return the tessellation control shader for this test
+ (or None if this test doesn't require a geometry shader).
+ No need to reimplement this function in classes that don't
+ use geometry shaders.
+ """
+ return None
+
+ def make_tess_eval_shader(self):
+ """Return the tessellation evaluation shader for this test
+ (or None if this test doesn't require a geometry shader).
+ No need to reimplement this function in classes that don't
+ use geometry shaders.
+ """
+ return None
+
def make_geometry_shader(self):
"""Return the geometry shader for this test (or None if this
test doesn't require a geometry shader). No need to
@@ -415,8 +437,8 @@ class ShaderTest(object):
shader, after the built-in function is called.
"""
shader = ''
- if self._signature.extension:
- shader += '#extension GL_{0} : require\n'.format(self._signature.extension)
+ for ext in self.extensions():
+ shader += '#extension GL_{0} : require\n'.format(ext)
shader += additional_declarations
for i in xrange(len(self._signature.argtypes)):
shader += 'uniform {0} arg{1};\n'.format(
@@ -469,8 +491,8 @@ class ShaderTest(object):
def filename(self):
argtype_names = '-'.join(
str(argtype) for argtype in self._signature.argtypes)
- if self._signature.extension:
- subdir = self._signature.extension.lower()
+ if self.extensions():
+ subdir = self.extensions()[0].lower()
else:
subdir = 'glsl-{0:1.2f}'.format(float(self.glsl_version()) / 100)
return os.path.join(
@@ -489,6 +511,16 @@ class ShaderTest(object):
shader_test += '[vertex shader]\n'
shader_test += self.make_vertex_shader()
shader_test += '\n'
+ tcs = self.make_tess_ctrl_shader()
+ if tcs:
+ shader_test += '[tessellation control shader]\n'
+ shader_test += tcs
+ shader_test += '\n'
+ tes = self.make_tess_eval_shader()
+ if tes:
+ shader_test += '[tessellation evaluation shader]\n'
+ shader_test += tes
+ shader_test += '\n'
gs = self.make_geometry_shader()
if gs:
shader_test += '[geometry shader]\n'
@@ -544,6 +576,94 @@ void main()
return shader
+class TessellationShaderTest(ShaderTest):
+ """Abstract class for tests that exercise the built-in in
+ tessellation shaders.
+ """
+
+ def glsl_version(self):
+ return max(150, ShaderTest.glsl_version(self))
+
+ def extensions(self):
+ ext = []
+ if self._signature.extension:
+ ext.append(self._signature.extension)
+ ext.append("ARB_tessellation_shader")
+ return ext
+
+ def draw_command(self):
+ return 'draw arrays GL_PATCHES 0 3\n'
+
+ def make_vertex_shader(self):
+ shader = \
+"""in vec4 vertex;
+out vec4 vertex_to_tcs;
+
+void main()
+{
+ vertex_to_tcs = vertex;
+}
+"""
+ return shader
+
+ def make_fragment_shader(self):
+ shader = \
+"""in vec4 color_to_fs;
+
+void main()
+{
+ gl_FragColor = color_to_fs;
+}
+"""
+ return shader
+
+
+class TessCtrlShaderTest(TessellationShaderTest):
+ """Derived class for tests that exercise the built-in in a
+ tessellation control shader.
+ """
+
+ def test_prefix(self):
+ return 'tcs'
+
+ def make_tess_ctrl_shader(self):
+ additional_declarations = \
+"""layout(vertices = 3) out;
+in vec4 vertex_to_tcs[];
+out vec4 vertex_to_tes[3];
+patch out vec4 color_to_tes;
+"""
+ body = \
+""" vertex_to_tes[gl_InvocationID] = vertex_to_tcs[gl_InvocationID];
+ color_to_tes = tmp_color;
+ gl_TessLevelOuter = float[4](1.0, 1.0, 1.0, 1.0);
+ gl_TessLevelInner = float[2](1.0, 1.0);
+"""
+ shader = self.make_test_shader(
+ additional_declarations,
+ ' vec4 tmp_color;\n',
+ 'tmp_color',
+ body)
+ return shader
+
+ def make_tess_eval_shader(self):
+ shader = \
+"""#extension GL_ARB_tessellation_shader : require
+layout(quads) in;
+
+in vec4 vertex_to_tes[];
+patch in vec4 color_to_tes;
+out vec4 color_to_fs;
+void main() {
+ gl_Position = vertex_to_tes[1]
+ + (vertex_to_tes[0] - vertex_to_tes[1]) * gl_TessCoord[0]
+ + (vertex_to_tes[2] - vertex_to_tes[1]) * gl_TessCoord[1];
+ color_to_fs = color_to_tes;
+}
+"""
+ return shader
+
+
class GeometryShaderTest(ShaderTest):
"""Derived class for tests that exercise the built-in in a
geometry shader.
@@ -626,6 +746,7 @@ def all_tests():
if use_if and signature.rettype != glsl_bool:
continue
yield VertexShaderTest(signature, test_vectors, use_if)
+ yield TessCtrlShaderTest(signature, test_vectors, use_if)
yield GeometryShaderTest(signature, test_vectors, use_if)
yield FragmentShaderTest(signature, test_vectors, use_if)
--
2.0.4
More information about the Piglit
mailing list