[Piglit] [PATCH] glsl-es-3.00: test for 'invariant(all)' usage in a fragment shader

Dylan Baker baker.dylan.c at gmail.com
Fri Nov 7 09:01:55 PST 2014


On Friday, November 07, 2014 08:55:36 AM Wang, Shuo wrote:
> 
> 	Since "#version 300 es" is necessary by Spec and below is the content of page 9 of Spec " The OpenGL ES® Shading Language Language Version: 3.00 Document Revision: 3 11 July 2012"
> 	"The directive "#version 300 es" is required in any shader that uses version 3.00 of the language. Any number representing a version of the language a compiler does not support will cause an error to be
> generated. Version 1.00 of the language does not require shaders to include this directive, and shaders that do not include a #version directive will be treated as targeting version 1.00."
> 
> 	I suppose Ian and DyIan mean the infrastructure will add the token "#version 300 es" automatically if the GLSL ES30 shader do not contain it. 
> 	So I write a patch to add the feature as below(the same as attachment):

Hi,

I don't think that the python layer is the right place for this to be
added, I think it really belongs in the C layer, probably as part of
glslparsertest.c.

Dylan

> 
> Signed-off-by: Wang Shuo <shuo.wang at intel.com>
> ---
>  framework/test/glsl_parser_test.py | 71 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 71 insertions(+)
> 
> diff --git a/framework/test/glsl_parser_test.py b/framework/test/glsl_parser_test.py
> index 2c48888..8deeb01 100644
> --- a/framework/test/glsl_parser_test.py
> +++ b/framework/test/glsl_parser_test.py
> @@ -94,6 +94,7 @@ class GLSLParserTest(PiglitBaseTest):
>  
>          # a set that stores a list of keys that have been found already
>          self.__found_keys = set()
> +        is_glsles30_version_exist = 1
>  
>          # Parse the config file and get the config section, then write this
>          # section to a StringIO and pass that to ConfigParser
> @@ -104,6 +105,20 @@ class GLSLParserTest(PiglitBaseTest):
>                  print(e.message, file=sys.stderr)
>                  sys.exit(1)
>  
> +        # Check if the shader of GLSL ES 300 contained #version 300 es
> +        # If not, return 0
> +        # If ture, return 1
> +        if config['glsl_version'] == "3.00":
> +            with open(filepath, 'r') as testfileread:
> +                try:
> +                    is_glsles30_version_exist = self.__parserglsles3(testfileread, filepath)
> +                except GLSLParserException as e:
> +                    print(e.message, file=sys.stderr)
> +                    sys.exit(1)
> +
> +        # If the shader of GLSL ES 300 do not contained #version 300 es, add it at the first line of shader
> +        if( is_glsles30_version_exist == 0):
> +            self.__addglsles3version(filepath)
>          command = self.__get_command(config, filepath)
>          super(GLSLParserTest, self).__init__(command, run_concurrent=True)
>  
> @@ -213,6 +228,62 @@ class GLSLParserTest(PiglitBaseTest):
>  
>          return keys
>  
> +    def __parserglsles3(self, testfile, filepath):
> +        """ Private helper that parses the GLSL ES 300 shader file
> +
> +        This method parses the lines of GLSL ES 300 shader file. If the shader contain 
> +        #version 300 es, return 1. Else, return 0
> +
> +        It will raise GLSLParserExceptions if any part of the parsing
> +        fails.
> +
> +        """
> +
> +        # Text of shader section.
> +        # Create a generator that iterates over the lines in the shader file.
> +        # This allows us to run the loop until we find the #version es 300, if we find it, return 1
> +        # or return 0
> +        #raise GLSLParserException(filepath)
> +        lines = (l.strip() for l in testfile)
> +
> +        is_glsles30_head_contained = re.compile(r'\s*#version\s300\ses')
> +        tmp_is_glsles30_head_contained = 0
> +        for line in lines:
> +                match = is_glsles30_head_contained.match(line)
> +                if match:
> +                        tmp_is_glsles30_head_contained = 1
> +                        break
> +        
> +
> +        if tmp_is_glsles30_head_contained == 0:
> +            return 0
> +
> +        return 1
> +
> +
> +    def __addglsles3version(self, filepath):
> +        """ Private helper that add the #version 300 es to the certain shader file
> +
> +        This method add #version 300 es to the certain shader file which is based on GLSL ES 30
> +        and not contained a #version 300 es
> +
> +        It will raise GLSLParserExceptions if any part of the parsing
> +        fails.
> +
> +        """
> +
> +        # Text of shader section.
> +        # Add #version 300 es to the first line of GLSL ES 30 shader which is not contained it
> +        fp = file(filepath)
> +        s = fp.read()
> +        fp.close()
> +        a = s.split('\n')
> +        a.insert(0, '#version 300 es')
> +        s = '\n'.join(a)
> +        fp = file(filepath, 'w')
> +        fp.write(s)
> +        fp.close()
> +
>  
>  class GLSLParserException(Exception):
>      pass
> -- 
> 1.8.3.2
> 
> Thanks,
> Shuo
> 
> -----Original Message-----
> From: Piglit [mailto:piglit-bounces at lists.freedesktop.org] On Behalf Of Dylan Baker
> Sent: Friday, November 7, 2014 7:19 AM
> To: piglit at lists.freedesktop.org
> Subject: Re: [Piglit] [PATCH] glsl-es-3.00: test for 'invariant(all)' usage in a fragment shader
> 
> On Thursday, November 06, 2014 02:40:28 PM Ian Romanick wrote:
> > The test looks fine enough, but could you add a spec quotation to defend it?
> > 
> > On 11/04/2014 04:19 AM, Tapani Pälli wrote:
> > > Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> > > ---
> > >  tests/spec/glsl-es-3.00/compiler/invariant_all.frag | 12 ++++++++++++
> > >  1 file changed, 12 insertions(+)
> > >  create mode 100644 tests/spec/glsl-es-3.00/compiler/invariant_all.frag
> > > 
> > > diff --git a/tests/spec/glsl-es-3.00/compiler/invariant_all.frag b/tests/spec/glsl-es-3.00/compiler/invariant_all.frag
> > > new file mode 100644
> > > index 0000000..37031cf
> > > --- /dev/null
> > > +++ b/tests/spec/glsl-es-3.00/compiler/invariant_all.frag
> > > @@ -0,0 +1,12 @@
> > > +#version 300 es
> > 
> > The #version shouldn't be necessary with the current infrastructure, right?
> 
> Actually, we do. I think this is a bug.
> 
> > 
> > > +// [config]
> > > +// expect_result: fail
> > > +// glsl_version: 3.00
> > > +// [end config]
> > > +//
> > > +// Check that 'invariant(all)' cannot be used in fragment shader
> > > +
> > > +#pragma STDGL invariant(all)
> > > +void main()
> > > +{
> > > +}
> > > 
> > 
> > _______________________________________________
> > Piglit mailing list
> > Piglit at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/piglit
> > 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20141107/3bacf115/attachment.sig>


More information about the Piglit mailing list