1 # -*- coding: utf-8 -*-
3 #-------------------------------------------------------------------------
4 # drawElements Quality Program utilities
5 # --------------------------------------
7 # Copyright 2015 The Android Open Source Project
9 # Licensed under the Apache License, Version 2.0 (the "License");
10 # you may not use this file except in compliance with the License.
11 # You may obtain a copy of the License at
13 # http://www.apache.org/licenses/LICENSE-2.0
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS,
17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 # See the License for the specific language governing permissions and
19 # limitations under the License.
21 #-------------------------------------------------------------------------
30 CASE_FRAGMENT_SHADER_TEMPLATE = """
37 precision highp float;
52 CASE_VERTEX_SHADER_TEMPLATE = """
63 precision highp float;
65 layout(location=0) out vec4 o_color;
74 class UniformBlockCase(ShaderCase):
75 def __init__(self, name, shaderType, source, valid):
77 self.shaderType = shaderType
82 if self.shaderType == FRAGMENT:
85 "OUTPUT_DECLARATION": "layout(location=0) out vec4 o_color;"
88 source = fillTemplate(self.source, sourceParams)
93 "EXPECT": ("build_successful" if self.valid else "compile_fail")
96 return fillTemplate(CASE_FRAGMENT_SHADER_TEMPLATE, testCaseParams)
97 elif self.shaderType == VERTEX:
99 "OUTPUT": "gl_Position",
100 "OUTPUT_DECLARATION": ""
103 source = fillTemplate(self.source, sourceParams)
108 "EXPECT": ("build_successful" if self.valid else "compile_fail")
111 return fillTemplate(CASE_VERTEX_SHADER_TEMPLATE, testCaseParams)
115 def createCases(name, source, valid):
116 return [UniformBlockCase(name + "_vertex", VERTEX, source, valid),
117 UniformBlockCase(name + "_fragment", FRAGMENT, source, valid)]
119 repeatShaderTemplate = """
121 precision highp float;
123 ${{OUTPUT_DECLARATION}}
127 uniform vec4 uniformMember;
132 ${{OUTPUT}} = uniformBlock.uniformMember;
135 layoutQualifierShaderTemplate = """
137 precision highp float;
139 ${{OUTPUT_DECLARATION}}
141 layout(%s) uniform UniformBlock
148 ${{OUTPUT}} = uniformBlock.uniformMember;
151 layoutGlobalQualifierShaderTemplate = """
153 precision highp float;
157 ${{OUTPUT_DECLARATION}}
166 ${{OUTPUT}} = uniformBlock.uniformMember;
169 layoutMemberQualifierShaderTemplate = """
171 precision highp float;
173 ${{OUTPUT_DECLARATION}}
177 layout(%s) mat4 uniformMember;
182 ${{OUTPUT}} = uniformBlock.uniformMember[0];
185 layoutMemberVec4QualifierShaderTemplate = """
187 precision highp float;
189 ${{OUTPUT_DECLARATION}}
193 layout(%s) vec4 uniformMember;
198 ${{OUTPUT}} = uniformBlock.uniformMember;
201 noInstanceNameShaderTemplate = """
203 precision highp float;
205 ${{OUTPUT_DECLARATION}}
214 ${{OUTPUT}} = uniformMember;
217 sameVariableAndInstanceNameShaderTemplate = """
219 precision highp float;
221 ${{OUTPUT_DECLARATION}}
230 vec4 uniformBlock = vec4(0.0);
231 ${{OUTPUT}} = uniformBlock;
234 sameVariableAndBlockNameShaderTemplate = """
236 precision highp float;
238 ${{OUTPUT_DECLARATION}}
247 vec4 UniformBlock = vec4(0.0);
248 ${{OUTPUT}} = UniformBlock + uniformBlock.uniformMember;
251 repeatedBlockShaderTemplate = """
253 precision highp float;
255 ${{OUTPUT_DECLARATION}}
269 ${{OUTPUT}} = uniformBlockA.uniformMember + uniformBlockB.uniformMember;
272 repeatedBlockNoInstanceNameShaderTemplate = """
274 precision highp float;
276 ${{OUTPUT_DECLARATION}}
290 ${{OUTPUT}} = uniformBlock.uniformMember + uniformMember;
293 structMemberShaderTemplate = """
295 precision highp float;
297 ${{OUTPUT_DECLARATION}}
311 ${{OUTPUT}} = uniformBlock.st.uniformMember;
314 layoutStructMemberQualifierShaderTemplate = """
316 precision highp float;
318 ${{OUTPUT_DECLARATION}}
327 layout(%s) Struct st;
332 ${{OUTPUT}} = uniformBlock.st.uniformMember;
335 longIdentifierBlockNameShaderTemplate = ("""
337 precision highp float;
339 ${{OUTPUT_DECLARATION}}
341 // Total of 1024 characters
342 uniform """ + ("a" * 1024) + """
349 ${{OUTPUT}} = uniformBlock.uniformMember;
352 longIdentifierInstanceNameShaderTemplate = ("""
354 precision highp float;
356 ${{OUTPUT_DECLARATION}}
361 } """ + ("a" * 1024) + """;
362 // Total of 1024 characters
366 ${{OUTPUT}} = """ + ("a" * 1024) + """.uniformMember;
369 underscoreIdentifierInstanceNameShaderTemplate = ("""
371 precision highp float;
373 ${{OUTPUT_DECLARATION}}
382 ${{OUTPUT}} = _.uniformMember;
385 underscoreIdentifierBlockNameShaderTemplate = ("""
387 precision highp float;
389 ${{OUTPUT_DECLARATION}}
398 ${{OUTPUT}} = uniformBlock.uniformMember;
401 validCases = (createCases("repeat_interface_qualifier", repeatShaderTemplate, True)
402 + sum([createCases("layout_%s" % qualifier, layoutQualifierShaderTemplate % qualifier, True)
403 for qualifier in ["shared", "packed", "std140", "row_major", "column_major"]], [])
404 + createCases("layout_all", layoutQualifierShaderTemplate % "shared, packed, std140, row_major, column_major", True)
405 + createCases("layout_all_8_times", layoutQualifierShaderTemplate % str.join(", ", ["shared", "packed", "std140", "row_major", "column_major"] * 8), True)
406 + sum([createCases("global_layout_%s" % qualifier, layoutGlobalQualifierShaderTemplate % qualifier, True)
407 for qualifier in ["shared", "packed", "std140", "row_major", "column_major"]], [])
408 + createCases("global_layout_all", layoutGlobalQualifierShaderTemplate % "shared, packed, std140, row_major, column_major", True)
409 + createCases("global_layout_all_8_times", layoutGlobalQualifierShaderTemplate % str.join(", ", ["shared", "packed", "std140", "row_major", "column_major"] * 8), True)
410 + sum([createCases("member_layout_%s" % qualifier, layoutMemberQualifierShaderTemplate % qualifier, True)
411 for qualifier in ["row_major", "column_major"]], [])
412 + sum([createCases("member_layout_%s_vec4" % qualifier, layoutMemberVec4QualifierShaderTemplate % qualifier, True)
413 for qualifier in ["row_major", "column_major"]], [])
414 + createCases("member_layout_all", layoutMemberQualifierShaderTemplate % "row_major, column_major", True)
415 + createCases("member_layout_all_8_times", layoutMemberQualifierShaderTemplate % str.join(", ", ["row_major", "column_major"] * 8), True)
416 + createCases("no_instance_name", noInstanceNameShaderTemplate, True)
417 + createCases("same_variable_and_block_name", sameVariableAndBlockNameShaderTemplate, True)
418 + createCases("same_variable_and_instance_name", sameVariableAndInstanceNameShaderTemplate, True)
419 + createCases("struct_member", structMemberShaderTemplate, True)
420 + sum([createCases("struct_member_layout_%s" % qualifier, layoutStructMemberQualifierShaderTemplate % qualifier, True)
421 for qualifier in ["row_major", "column_major"]], [])
422 + createCases("struct_member_layout_all", layoutStructMemberQualifierShaderTemplate % "row_major, column_major", True)
423 + createCases("struct_member_layout_all_8_times", layoutStructMemberQualifierShaderTemplate % str.join(", ", ["row_major", "column_major"] * 8), True)
424 + createCases("long_block_name", longIdentifierBlockNameShaderTemplate, True)
425 + createCases("long_instance_name", longIdentifierInstanceNameShaderTemplate, True)
426 + createCases("underscore_block_name", underscoreIdentifierBlockNameShaderTemplate, True)
427 + createCases("underscore_instance_name", underscoreIdentifierInstanceNameShaderTemplate, True))
429 invalidMemberInterfaceQualifierShaderTemplate = """
431 precision highp float;
433 ${{OUTPUT_DECLARATION}}
437 %s vec4 uniformMember;
442 ${{OUTPUT}} = uniformBlock.uniformMember;
445 conflictingInstanceNamesShaderTemplate = """
447 precision highp float;
449 ${{OUTPUT_DECLARATION}}
451 uniform UniformBlockA
456 uniform UniformBlockB
463 ${{OUTPUT}} = uniformBlock.uniformMember;
466 conflictingFunctionAndInstanceNameShaderTemplate = """
468 precision highp float;
470 ${{OUTPUT_DECLARATION}}
477 float uniformBlock (float x)
484 ${{OUTPUT}} = uniformBlock.uniformMember;
487 conflictingFunctionAndBlockNameShaderTemplate = """
489 precision highp float;
491 ${{OUTPUT_DECLARATION}}
498 float UniformBlock (float x)
505 ${{OUTPUT}} = uniformBlock.uniformMember;
508 conflictingVariableAndInstanceNameShaderTemplate = """
510 precision highp float;
512 ${{OUTPUT_DECLARATION}}
519 %s vec4 uniformBlock;
523 ${{OUTPUT}} = uniformBlock.uniformMember;
526 conflictingVariableAndBlockNameShaderTemplate = """
528 precision highp float;
530 ${{OUTPUT_DECLARATION}}
537 %s vec4 UniformBlock;
541 ${{OUTPUT}} = uniformBlock.uniformMember;
545 matchingInstanceAndBlockNameShaderTemplate = """
547 precision highp float;
549 ${{OUTPUT_DECLARATION}}
558 ${{OUTPUT}} = UniformBlock.uniformMember;
561 referenceUsingBlockNameShaderTemplate = """
563 precision highp float;
565 ${{OUTPUT_DECLARATION}}
574 ${{OUTPUT}} = UniformBlock.uniformMember;
577 emptyBlockShaderTemplate = """
579 precision highp float;
581 ${{OUTPUT_DECLARATION}}
589 ${{OUTPUT}} = vec4(0.0);
592 emptyLayoutShaderTemplate = """
594 precision highp float;
596 ${{OUTPUT_DECLARATION}}
598 layout() uniform UniformBlock
605 ${{OUTPUT}} = uniformBlock.uniformMember;
608 emptyGlobalLayoutShaderTemplate = """
610 precision highp float;
614 ${{OUTPUT_DECLARATION}}
623 ${{OUTPUT}} = uniformBlock.uniformMember;
626 emptyMemberLayoutShaderTemplate = """
628 precision highp float;
630 ${{OUTPUT_DECLARATION}}
634 layout() vec4 uniformMember;
639 ${{OUTPUT}} = uniformBlock.uniformMember;
642 invalidMemberLayoutShaderTemplate = """
644 precision highp float;
646 ${{OUTPUT_DECLARATION}}
650 layout(%s) vec4 uniformMember;
655 ${{OUTPUT}} = uniformBlock.uniformMember;
658 structureDefinitionShaderTemplate = """
660 precision highp float;
662 ${{OUTPUT_DECLARATION}}
674 ${{OUTPUT}} = uniformBlock.a.uniformMember;
677 samplerShaderTemplate = """
679 precision highp float;
681 ${{OUTPUT_DECLARATION}}
691 ${{OUTPUT}} = uniformBlock.uniformMember;
694 missingBlockNameShaderTemplate = """
696 precision highp float;
698 ${{OUTPUT_DECLARATION}}
707 ${{OUTPUT}} = uniformBlock.uniformMember;
710 invalidNumberBlockNameShaderTemplate = """
712 precision highp float;
714 ${{OUTPUT_DECLARATION}}
716 uniform 0UniformBlock
723 ${{OUTPUT}} = uniformBlock.uniformMember;
726 invalidHashBlockNameShaderTemplate = """
728 precision highp float;
730 ${{OUTPUT_DECLARATION}}
732 uniform #UniformBlock
739 ${{OUTPUT}} = uniformBlock.uniformMember;
742 invalidDollarBlockNameShaderTemplate = """
744 precision highp float;
746 ${{OUTPUT_DECLARATION}}
748 uniform $UniformBlock
755 ${{OUTPUT}} = uniformBlock.uniformMember;
758 invalidIdentifierBlockNameShaderTemplate = """
760 precision highp float;
762 ${{OUTPUT_DECLARATION}}
764 uniform gl_UniformBlock
771 ${{OUTPUT}} = uniformBlock.uniformMember;
774 tooLongIdentifierBlockNameShaderTemplate = ("""
776 precision highp float;
778 ${{OUTPUT_DECLARATION}}
780 // Total of 1025 characters
781 uniform """ + ("a" * 1025) + """
788 ${{OUTPUT}} = uniformBlock.uniformMember;
791 invalidNumberInstanceNameShaderTemplate = """
793 precision highp float;
795 ${{OUTPUT_DECLARATION}}
797 uniform UniformInstance
804 ${{OUTPUT}} = 0uniformBlock.uniformMember;
807 invalidHashInstanceNameShaderTemplate = """
809 precision highp float;
811 ${{OUTPUT_DECLARATION}}
813 uniform UniformInstance
820 ${{OUTPUT}} = #uniformBlock.uniformMember;
823 invalidDollarInstanceNameShaderTemplate = """
825 precision highp float;
827 ${{OUTPUT_DECLARATION}}
829 uniform UniformInstance
836 ${{OUTPUT}} = $uniformBlock.uniformMember;
839 invalidIdentifierInstanceNameShaderTemplate = """
841 precision highp float;
843 ${{OUTPUT_DECLARATION}}
852 ${{OUTPUT}} = gl_uniformBlock.uniformMember;
855 tooLongIdentifierInstanceNameShaderTemplate = ("""
857 precision highp float;
859 ${{OUTPUT_DECLARATION}}
864 } """ + ("a" * 1025) + """;
865 // Total of 1025 characters
869 ${{OUTPUT}} = """ + ("a" * 1025) + """.uniformMember;
873 sum([createCases("member_%s_interface_qualifier" % qualifier, invalidMemberInterfaceQualifierShaderTemplate % qualifier, False)
874 for qualifier in ["in", "out", "buffer", "attribute", "varying"]], [])
875 + createCases("conflicting_instance_names", conflictingInstanceNamesShaderTemplate, False)
876 + createCases("conflicting_function_and_instance_name", conflictingFunctionAndInstanceNameShaderTemplate, False)
877 + createCases("conflicting_function_and_block_name", conflictingFunctionAndBlockNameShaderTemplate, False)
878 + sum([createCases("conflicting_%s_and_instance_name" % qualifier, conflictingVariableAndInstanceNameShaderTemplate % qualifier, False)
879 for qualifier in ["uniform", "in", "out"]], [])
880 + sum([createCases("conflicting_%s_and_block_name" % qualifier, conflictingVariableAndBlockNameShaderTemplate % qualifier, False)
881 for qualifier in ["uniform", "in", "out"]], [])
882 + createCases("matching_instance_and_block_name", matchingInstanceAndBlockNameShaderTemplate, False)
883 + createCases("reference_using_block_name", referenceUsingBlockNameShaderTemplate, False)
884 + createCases("empty_block", emptyBlockShaderTemplate, False)
885 + createCases("empty_layout", emptyLayoutShaderTemplate, False)
886 + createCases("empty_member_layout", emptyMemberLayoutShaderTemplate, False)
887 + createCases("empty_global_layout", emptyGlobalLayoutShaderTemplate, False)
888 + createCases("structure_definition", structureDefinitionShaderTemplate, False)
889 + sum([createCases("member_layout_%s" % qualifier, invalidMemberLayoutShaderTemplate % qualifier, False)
890 for qualifier in ["shared", "packed", "std140"]], [])
891 + createCases("missing_block_name", missingBlockNameShaderTemplate, False)
892 + createCases("invalid_number_block_name", invalidNumberBlockNameShaderTemplate, False)
893 + createCases("invalid_hash_block_name", invalidHashBlockNameShaderTemplate, False)
894 + createCases("invalid_dollar_block_name", invalidDollarBlockNameShaderTemplate, False)
895 + createCases("invalid_identifier_block_name", invalidIdentifierBlockNameShaderTemplate, False)
896 + createCases("too_long_block_name", tooLongIdentifierBlockNameShaderTemplate, False)
897 + createCases("invalid_number_instance_name", invalidNumberInstanceNameShaderTemplate, False)
898 + createCases("invalid_hash_instance_name", invalidDollarInstanceNameShaderTemplate, False)
899 + createCases("invalid_dollar_instance_name", invalidDollarInstanceNameShaderTemplate, False)
900 + createCases("invalid_identifier_instance_name", invalidIdentifierInstanceNameShaderTemplate, False)
901 + createCases("repeated_block", repeatedBlockShaderTemplate, False)
902 + createCases("repeated_block_no_instance_name", repeatedBlockNoInstanceNameShaderTemplate, False)
905 allCases.append(CaseGroup("valid", "Valid uniform interface block syntax tests.", validCases))
906 allCases.append(CaseGroup("invalid", "Invalid uniform interface block syntax tests.", invalidCases))
908 if __name__ == "__main__":
909 print "Generating shader case files."
910 writeAllCases("uniform_block.test", allCases)