diff options
author | Fabian Bieler <fabianbieler@fastmail.fm> | 2014-03-21 10:55:49 +0100 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2015-07-29 21:43:48 +0200 |
commit | 3d25e759a05173895635c7e6ef9f3223b1db2c57 (patch) | |
tree | 1874c55142fa8665cd5f7aa2c375364169365844 | |
parent | 804fff51dc36e19393deb1eb70b670f31876f71d (diff) |
gen_builtin_uniform_tests.py: Add tessellation control shader tests.
v2: fixed by Marek
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
-rw-r--r-- | generated_tests/gen_builtin_uniform_tests.py | 137 | ||||
-rw-r--r-- | tests/shaders/shader_runner.c | 9 |
2 files changed, 142 insertions, 4 deletions
diff --git a/generated_tests/gen_builtin_uniform_tests.py b/generated_tests/gen_builtin_uniform_tests.py index c88add51a..009a05de9 100644 --- a/generated_tests/gen_builtin_uniform_tests.py +++ b/generated_tests/gen_builtin_uniform_tests.py @@ -397,6 +397,12 @@ class ShaderTest(object): self.rect_height, probe_vector[0], probe_vector[1], probe_vector[2], probe_vector[3]) + def extensions(self): + ext = [] + if self._signature.extension: + ext.append(self._signature.extension) + return ext + def make_additional_requirements(self): """Return a string that should be included in the test's [require] section. @@ -418,6 +424,22 @@ class ShaderTest(object): """ return None + 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 @@ -471,8 +493,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 range(len(self._signature.argtypes)): shader += 'uniform {0} arg{1};\n'.format( @@ -521,8 +543,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( @@ -543,6 +565,16 @@ class ShaderTest(object): shader_test += '[vertex shader]\n' shader_test += vs 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' @@ -605,6 +637,102 @@ 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 make_additional_requirements(self): + return 'GL_ARB_tessellation_shader' + + def extensions(self): + ext = [] + if self._signature.extension: + ext.append(self._signature.extension) + ext.append("ARB_tessellation_shader") + return ext + + def draw_command(self, test_num): + x = (test_num % self.tests_per_row) * self.rect_width + y = (test_num // self.tests_per_row) * self.rect_height + assert(y < self.test_rows) + return 'draw rect ortho patch {0} {1} {2} {3}\n'.format(x, y, + self.rect_width, + self.rect_height) + + def make_vertex_shader(self): + shader = \ +"""in vec4 piglit_vertex; +out vec4 vertex_to_tcs; + +void main() +{ + vertex_to_tcs = piglit_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 = 4) out; +in vec4 vertex_to_tcs[]; +out vec4 vertex_to_tes[]; +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 = mix(mix(vertex_to_tes[0], vertex_to_tes[1], gl_TessCoord.x), + mix(vertex_to_tes[2], vertex_to_tes[3], gl_TessCoord.x), + gl_TessCoord.y); + color_to_fs = color_to_tes; +} +""" + return shader + + class GeometryShaderTest(ShaderTest): """Derived class for tests that exercise the built-in in a geometry shader. @@ -731,6 +859,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) yield ComputeShaderTest(signature, test_vectors, use_if) diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c index 24c86ac09..be6e6ae56 100644 --- a/tests/shaders/shader_runner.c +++ b/tests/shaders/shader_runner.c @@ -2506,6 +2506,15 @@ piglit_display(void) get_floats(line + 13, c, 8); piglit_draw_rect_tex(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]); + } else if (string_match("draw rect ortho patch", line)) { + program_must_be_in_use(); + program_subroutine_uniforms(); + get_floats(line + 21, c, 4); + + piglit_draw_rect_custom(-1.0 + 2.0 * (c[0] / piglit_width), + -1.0 + 2.0 * (c[1] / piglit_height), + 2.0 * (c[2] / piglit_width), + 2.0 * (c[3] / piglit_height), true); } else if (string_match("draw rect ortho", line)) { program_must_be_in_use(); program_subroutine_uniforms(); |