On Mon, Jul 27, 2015 at 8:02 PM, Marek Olšák <[email protected]> wrote: > From: Fabian Bieler <[email protected]> > > v2: fixed by Marek > > Reviewed-by: Marek Olšák <[email protected]> > --- > generated_tests/gen_builtin_uniform_tests.py | 137 > ++++++++++++++++++++++++++- > 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 c88add5..009a05d 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);
FWIW I liked your quads thing a lot better, i.e. vec4(2 * gl_TessCoord.xy - 1, 0, 1); Removes the need for the tcs complexity too. Either way, Reviewed-by: Ilia Mirkin <[email protected]> > + 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 24c86ac..be6e6ae 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(); > -- > 2.1.4 > > _______________________________________________ > Piglit mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/piglit _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
