[Piglit] [PATCH 04/12] gen_builtin_uniform_tests.py: Add tessellation control shader tests.

Ilia Mirkin imirkin at alum.mit.edu
Wed Sep 17 22:50:34 PDT 2014


On Thu, Sep 18, 2014 at 1:12 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Wed, Sep 17, 2014 at 3:42 AM, Chris Forbes <chrisf at ijw.co.nz> wrote:
>> From: Fabian Bieler <fabianbieler at fastmail.fm>
>>
>> ---
>>  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'
>
> Should this be 3 or 6? I assumed you'd want 2 triangles to cover the
> whole screen? (And I think the vertex data is laid out as a triangle
> fan, which is no good for these purposes...)

As discussed on IRC, looks like this is fine. You'll be sending an
extra vertex for no reason, but it should get dropped as an incomplete
patch.

For the record, this works out because it uses a quad layout, and uses
the 3 input vertices as the control points for a rectangle.

Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>

>
>> +
>> +    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.1.0
>>
>> _______________________________________________
>> Piglit mailing list
>> Piglit at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list