Home | History | Annotate | Download | only in scripts
      1 # -*- coding: utf-8 -*-
      2 
      3 #-------------------------------------------------------------------------
      4 # drawElements Quality Program utilities
      5 # --------------------------------------
      6 #
      7 # Copyright 2015 The Android Open Source Project
      8 #
      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
     12 #
     13 #      http://www.apache.org/licenses/LICENSE-2.0
     14 #
     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.
     20 #
     21 #-------------------------------------------------------------------------
     22 
     23 from genutil import *
     24 
     25 allCases = []
     26 
     27 VERTEX = "VERTEX"
     28 FRAGMENT = "FRAGMENT"
     29 
     30 CASE_FRAGMENT_SHADER_TEMPLATE = """
     31 case ${{NAME}}
     32 	version 300 es
     33 	expect ${{EXPECT}}
     34 
     35 	vertex ""
     36 		#version 300 es
     37 		precision highp float;
     38 
     39 		in vec4 a_pos;
     40 
     41 		void main()
     42 		{
     43 			gl_Position = a_pos;
     44 		}
     45 	""
     46 
     47 	fragment ""
     48 		${{SOURCE}}
     49 	""
     50 end"""[1:]
     51 
     52 CASE_VERTEX_SHADER_TEMPLATE = """
     53 case ${{NAME}}
     54 	version 300 es
     55 	expect ${{EXPECT}}
     56 
     57 	vertex ""
     58 		${{SOURCE}}
     59 	""
     60 
     61 	fragment ""
     62 		#version 300 es
     63 		precision highp float;
     64 
     65 		layout(location=0) out vec4 o_color;
     66 
     67 		void main()
     68 		{
     69 			o_color = vec4(1.0);
     70 		}
     71 	""
     72 end"""[1:]
     73 
     74 class UniformBlockCase(ShaderCase):
     75 	def __init__(self, name, shaderType, source, valid):
     76 		self.name = name
     77 		self.shaderType = shaderType
     78 		self.source = source
     79 		self.valid = valid
     80 
     81 	def __str__(self):
     82 		if self.shaderType == FRAGMENT:
     83 			sourceParams = {
     84 				"OUTPUT":				"o_color",
     85 				"OUTPUT_DECLARATION":	"layout(location=0) out vec4 o_color;"
     86 			}
     87 
     88 			source = fillTemplate(self.source, sourceParams)
     89 
     90 			testCaseParams = {
     91 				"NAME":		self.name,
     92 				"SOURCE":	source,
     93 				"EXPECT":	("build_successful" if self.valid else "compile_fail")
     94 			}
     95 
     96 			return fillTemplate(CASE_FRAGMENT_SHADER_TEMPLATE, testCaseParams)
     97 		elif self.shaderType == VERTEX:
     98 			sourceParams = {
     99 				"OUTPUT":				"gl_Position",
    100 				"OUTPUT_DECLARATION":	""
    101 			}
    102 
    103 			source = fillTemplate(self.source, sourceParams)
    104 
    105 			testCaseParams = {
    106 				"NAME":		self.name,
    107 				"SOURCE":	source,
    108 				"EXPECT":	("build_successful" if self.valid else "compile_fail")
    109 			}
    110 
    111 			return fillTemplate(CASE_VERTEX_SHADER_TEMPLATE, testCaseParams)
    112 
    113 		assert False
    114 
    115 def createCases(name, source, valid):
    116 	return [UniformBlockCase(name + "_vertex", VERTEX, source, valid),
    117 			UniformBlockCase(name + "_fragment", FRAGMENT, source, valid)]
    118 
    119 repeatShaderTemplate = """
    120 #version 300 es
    121 precision highp float;
    122 
    123 ${{OUTPUT_DECLARATION}}
    124 
    125 uniform UniformBlock
    126 {
    127 	uniform vec4 uniformMember;
    128 } uniformBlock;
    129 
    130 void main()
    131 {
    132 	${{OUTPUT}} = uniformBlock.uniformMember;
    133 }"""[1:]
    134 
    135 layoutQualifierShaderTemplate = """
    136 #version 300 es
    137 precision highp float;
    138 
    139 ${{OUTPUT_DECLARATION}}
    140 
    141 layout(%s) uniform UniformBlock
    142 {
    143 	vec4 uniformMember;
    144 } uniformBlock;
    145 
    146 void main()
    147 {
    148 	${{OUTPUT}} = uniformBlock.uniformMember;
    149 }"""[1:]
    150 
    151 layoutGlobalQualifierShaderTemplate = """
    152 #version 300 es
    153 precision highp float;
    154 
    155 layout(%s) uniform;
    156 
    157 ${{OUTPUT_DECLARATION}}
    158 
    159 uniform UniformBlock
    160 {
    161 	vec4 uniformMember;
    162 } uniformBlock;
    163 
    164 void main()
    165 {
    166 	${{OUTPUT}} = uniformBlock.uniformMember;
    167 }"""[1:]
    168 
    169 layoutMemberQualifierShaderTemplate = """
    170 #version 300 es
    171 precision highp float;
    172 
    173 ${{OUTPUT_DECLARATION}}
    174 
    175 uniform UniformBlock
    176 {
    177 	layout(%s) mat4 uniformMember;
    178 } uniformBlock;
    179 
    180 void main()
    181 {
    182 	${{OUTPUT}} = uniformBlock.uniformMember[0];
    183 }"""[1:]
    184 
    185 layoutMemberVec4QualifierShaderTemplate = """
    186 #version 300 es
    187 precision highp float;
    188 
    189 ${{OUTPUT_DECLARATION}}
    190 
    191 uniform UniformBlock
    192 {
    193 	layout(%s) vec4 uniformMember;
    194 } uniformBlock;
    195 
    196 void main()
    197 {
    198 	${{OUTPUT}} = uniformBlock.uniformMember;
    199 }"""[1:]
    200 
    201 noInstanceNameShaderTemplate = """
    202 #version 300 es
    203 precision highp float;
    204 
    205 ${{OUTPUT_DECLARATION}}
    206 
    207 uniform UniformBlock
    208 {
    209 	vec4 uniformMember;
    210 };
    211 
    212 void main()
    213 {
    214 	${{OUTPUT}} = uniformMember;
    215 }"""[1:]
    216 
    217 sameVariableAndInstanceNameShaderTemplate = """
    218 #version 300 es
    219 precision highp float;
    220 
    221 ${{OUTPUT_DECLARATION}}
    222 
    223 uniform UniformBlock
    224 {
    225 	vec4 uniformMember;
    226 } uniformBlock;
    227 
    228 void main()
    229 {
    230 	vec4 uniformBlock = vec4(0.0);
    231 	${{OUTPUT}} = uniformBlock;
    232 }"""[1:]
    233 
    234 sameVariableAndBlockNameShaderTemplate = """
    235 #version 300 es
    236 precision highp float;
    237 
    238 ${{OUTPUT_DECLARATION}}
    239 
    240 uniform UniformBlock
    241 {
    242 	vec4 uniformMember;
    243 } uniformBlock;
    244 
    245 void main()
    246 {
    247 	vec4 UniformBlock = vec4(0.0);
    248 	${{OUTPUT}} = UniformBlock + uniformBlock.uniformMember;
    249 }"""[1:]
    250 
    251 repeatedBlockShaderTemplate = """
    252 #version 300 es
    253 precision highp float;
    254 
    255 ${{OUTPUT_DECLARATION}}
    256 
    257 uniform UniformBlock
    258 {
    259 	vec4 uniformMember;
    260 } uniformBlockA;
    261 
    262 uniform UniformBlock
    263 {
    264 	vec4 uniformMember;
    265 } uniformBlockB;
    266 
    267 void main()
    268 {
    269 	${{OUTPUT}} = uniformBlockA.uniformMember + uniformBlockB.uniformMember;
    270 }"""[1:]
    271 
    272 repeatedBlockNoInstanceNameShaderTemplate = """
    273 #version 300 es
    274 precision highp float;
    275 
    276 ${{OUTPUT_DECLARATION}}
    277 
    278 uniform UniformBlock
    279 {
    280 	vec4 uniformMember;
    281 } uniformBlock;
    282 
    283 uniform UniformBlock
    284 {
    285 	vec4 uniformMember;
    286 };
    287 
    288 void main()
    289 {
    290 	${{OUTPUT}} = uniformBlock.uniformMember + uniformMember;
    291 }"""[1:]
    292 
    293 structMemberShaderTemplate = """
    294 #version 300 es
    295 precision highp float;
    296 
    297 ${{OUTPUT_DECLARATION}}
    298 
    299 struct Struct
    300 {
    301 	vec4 uniformMember;
    302 };
    303 
    304 uniform UniformBlock
    305 {
    306 	Struct st;
    307 } uniformBlock;
    308 
    309 void main()
    310 {
    311 	${{OUTPUT}} = uniformBlock.st.uniformMember;
    312 }"""[1:]
    313 
    314 layoutStructMemberQualifierShaderTemplate = """
    315 #version 300 es
    316 precision highp float;
    317 
    318 ${{OUTPUT_DECLARATION}}
    319 
    320 struct Struct
    321 {
    322 	vec4 uniformMember;
    323 };
    324 
    325 uniform UniformBlock
    326 {
    327 	layout(%s) Struct st;
    328 } uniformBlock;
    329 
    330 void main()
    331 {
    332 	${{OUTPUT}} = uniformBlock.st.uniformMember;
    333 }"""[1:]
    334 
    335 longIdentifierBlockNameShaderTemplate = ("""
    336 #version 300 es
    337 precision highp float;
    338 
    339 ${{OUTPUT_DECLARATION}}
    340 
    341 // Total of 1024 characters
    342 uniform """ + ("a" * 1024) + """
    343 {
    344 	vec4 uniformMember;
    345 } uniformBlock;
    346 
    347 void main()
    348 {
    349 	${{OUTPUT}} = uniformBlock.uniformMember;
    350 }""")[1:]
    351 
    352 longIdentifierInstanceNameShaderTemplate = ("""
    353 #version 300 es
    354 precision highp float;
    355 
    356 ${{OUTPUT_DECLARATION}}
    357 
    358 uniform UniformBlock
    359 {
    360 	vec4 uniformMember;
    361 } """ + ("a" * 1024) + """;
    362 // Total of 1024 characters
    363 
    364 void main()
    365 {
    366 	${{OUTPUT}} = """ + ("a" * 1024) + """.uniformMember;
    367 }""")[1:]
    368 
    369 underscoreIdentifierInstanceNameShaderTemplate = ("""
    370 #version 300 es
    371 precision highp float;
    372 
    373 ${{OUTPUT_DECLARATION}}
    374 
    375 uniform UniformBlock
    376 {
    377 	vec4 uniformMember;
    378 } _;
    379 
    380 void main()
    381 {
    382 	${{OUTPUT}} = _.uniformMember;
    383 }""")[1:]
    384 
    385 underscoreIdentifierBlockNameShaderTemplate = ("""
    386 #version 300 es
    387 precision highp float;
    388 
    389 ${{OUTPUT_DECLARATION}}
    390 
    391 uniform _
    392 {
    393 	vec4 uniformMember;
    394 } uniformBlock;
    395 
    396 void main()
    397 {
    398 	${{OUTPUT}} = uniformBlock.uniformMember;
    399 }""")[1:]
    400 
    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))
    428 
    429 invalidMemberInterfaceQualifierShaderTemplate = """
    430 #version 300 es
    431 precision highp float;
    432 
    433 ${{OUTPUT_DECLARATION}}
    434 
    435 uniform UniformBlock
    436 {
    437 	%s vec4 uniformMember;
    438 } uniformBlock;
    439 
    440 void main()
    441 {
    442 	${{OUTPUT}} = uniformBlock.uniformMember;
    443 }"""[1:]
    444 
    445 conflictingInstanceNamesShaderTemplate = """
    446 #version 300 es
    447 precision highp float;
    448 
    449 ${{OUTPUT_DECLARATION}}
    450 
    451 uniform UniformBlockA
    452 {
    453 	vec4 uniformMember;
    454 } uniformBlock;
    455 
    456 uniform UniformBlockB
    457 {
    458 	vec4 uniformMember;
    459 } uniformBlock;
    460 
    461 void main()
    462 {
    463 	${{OUTPUT}} = uniformBlock.uniformMember;
    464 }"""[1:]
    465 
    466 conflictingFunctionAndInstanceNameShaderTemplate = """
    467 #version 300 es
    468 precision highp float;
    469 
    470 ${{OUTPUT_DECLARATION}}
    471 
    472 uniform UniformBlock
    473 {
    474 	vec4 uniformMember;
    475 } uniformBlock;
    476 
    477 float uniformBlock (float x)
    478 {
    479 	return x;
    480 }
    481 
    482 void main()
    483 {
    484 	${{OUTPUT}} = uniformBlock.uniformMember;
    485 }"""[1:]
    486 
    487 conflictingFunctionAndBlockNameShaderTemplate = """
    488 #version 300 es
    489 precision highp float;
    490 
    491 ${{OUTPUT_DECLARATION}}
    492 
    493 uniform UniformBlock
    494 {
    495 	vec4 uniformMember;
    496 } uniformBlock;
    497 
    498 float UniformBlock (float x)
    499 {
    500 	return x;
    501 }
    502 
    503 void main()
    504 {
    505 	${{OUTPUT}} = uniformBlock.uniformMember;
    506 }"""[1:]
    507 
    508 conflictingVariableAndInstanceNameShaderTemplate = """
    509 #version 300 es
    510 precision highp float;
    511 
    512 ${{OUTPUT_DECLARATION}}
    513 
    514 uniform UniformBlock
    515 {
    516 	vec4 uniformMember;
    517 } uniformBlock;
    518 
    519 %s vec4 uniformBlock;
    520 
    521 void main()
    522 {
    523 	${{OUTPUT}} = uniformBlock.uniformMember;
    524 }"""[1:]
    525 
    526 conflictingVariableAndBlockNameShaderTemplate = """
    527 #version 300 es
    528 precision highp float;
    529 
    530 ${{OUTPUT_DECLARATION}}
    531 
    532 uniform UniformBlock
    533 {
    534 	vec4 uniformMember;
    535 } uniformBlock;
    536 
    537 %s vec4 UniformBlock;
    538 
    539 void main()
    540 {
    541 	${{OUTPUT}} = uniformBlock.uniformMember;
    542 }"""[1:]
    543 
    544 
    545 matchingInstanceAndBlockNameShaderTemplate = """
    546 #version 300 es
    547 precision highp float;
    548 
    549 ${{OUTPUT_DECLARATION}}
    550 
    551 uniform UniformBlock
    552 {
    553 	vec4 uniformMember;
    554 } UniformBlock;
    555 
    556 void main()
    557 {
    558 	${{OUTPUT}} = UniformBlock.uniformMember;
    559 }"""[1:]
    560 
    561 referenceUsingBlockNameShaderTemplate = """
    562 #version 300 es
    563 precision highp float;
    564 
    565 ${{OUTPUT_DECLARATION}}
    566 
    567 uniform UniformBlock
    568 {
    569 	vec4 uniformMember;
    570 } uniformBlock;
    571 
    572 void main()
    573 {
    574 	${{OUTPUT}} = UniformBlock.uniformMember;
    575 }"""[1:]
    576 
    577 emptyBlockShaderTemplate = """
    578 #version 300 es
    579 precision highp float;
    580 
    581 ${{OUTPUT_DECLARATION}}
    582 
    583 uniform UniformBlock
    584 {
    585 } uniformBlock;
    586 
    587 void main()
    588 {
    589 	${{OUTPUT}} = vec4(0.0);
    590 }"""[1:]
    591 
    592 emptyLayoutShaderTemplate = """
    593 #version 300 es
    594 precision highp float;
    595 
    596 ${{OUTPUT_DECLARATION}}
    597 
    598 layout() uniform UniformBlock
    599 {
    600 	vec4 uniformMember;
    601 } uniformBlock;
    602 
    603 void main()
    604 {
    605 	${{OUTPUT}} = uniformBlock.uniformMember;
    606 }"""[1:]
    607 
    608 emptyGlobalLayoutShaderTemplate = """
    609 #version 300 es
    610 precision highp float;
    611 
    612 layout() uniform;
    613 
    614 ${{OUTPUT_DECLARATION}}
    615 
    616 uniform UniformBlock
    617 {
    618 	vec4 uniformMember;
    619 } uniformBlock;
    620 
    621 void main()
    622 {
    623 	${{OUTPUT}} = uniformBlock.uniformMember;
    624 }"""[1:]
    625 
    626 emptyMemberLayoutShaderTemplate = """
    627 #version 300 es
    628 precision highp float;
    629 
    630 ${{OUTPUT_DECLARATION}}
    631 
    632 uniform UniformBlock
    633 {
    634 	layout() vec4 uniformMember;
    635 } uniformBlock;
    636 
    637 void main()
    638 {
    639 	${{OUTPUT}} = uniformBlock.uniformMember;
    640 }"""[1:]
    641 
    642 invalidMemberLayoutShaderTemplate = """
    643 #version 300 es
    644 precision highp float;
    645 
    646 ${{OUTPUT_DECLARATION}}
    647 
    648 uniform UniformBlock
    649 {
    650 	layout(%s) vec4 uniformMember;
    651 } uniformBlock;
    652 
    653 void main()
    654 {
    655 	${{OUTPUT}} = uniformBlock.uniformMember;
    656 }"""[1:]
    657 
    658 structureDefinitionShaderTemplate = """
    659 #version 300 es
    660 precision highp float;
    661 
    662 ${{OUTPUT_DECLARATION}}
    663 
    664 uniform UniformBlock
    665 {
    666 	struct A
    667 	{
    668 		vec4 uniformMember;
    669 	} a;
    670 } uniformBlock;
    671 
    672 void main()
    673 {
    674 	${{OUTPUT}} = uniformBlock.a.uniformMember;
    675 }"""[1:]
    676 
    677 samplerShaderTemplate = """
    678 #version 300 es
    679 precision highp float;
    680 
    681 ${{OUTPUT_DECLARATION}}
    682 
    683 uniform UniformBlock
    684 {
    685 	sampler2D sampler;
    686 	vec4 uniformMember;
    687 } uniformBlock;
    688 
    689 void main()
    690 {
    691 	${{OUTPUT}} = uniformBlock.uniformMember;
    692 }"""[1:]
    693 
    694 missingBlockNameShaderTemplate = """
    695 #version 300 es
    696 precision highp float;
    697 
    698 ${{OUTPUT_DECLARATION}}
    699 
    700 uniform
    701 {
    702 	vec4 uniformMember;
    703 } uniformBlock;
    704 
    705 void main()
    706 {
    707 	${{OUTPUT}} = uniformBlock.uniformMember;
    708 }"""[1:]
    709 
    710 invalidNumberBlockNameShaderTemplate = """
    711 #version 300 es
    712 precision highp float;
    713 
    714 ${{OUTPUT_DECLARATION}}
    715 
    716 uniform 0UniformBlock
    717 {
    718 	vec4 uniformMember;
    719 } uniformBlock;
    720 
    721 void main()
    722 {
    723 	${{OUTPUT}} = uniformBlock.uniformMember;
    724 }"""[1:]
    725 
    726 invalidHashBlockNameShaderTemplate = """
    727 #version 300 es
    728 precision highp float;
    729 
    730 ${{OUTPUT_DECLARATION}}
    731 
    732 uniform #UniformBlock
    733 {
    734 	vec4 uniformMember;
    735 } uniformBlock;
    736 
    737 void main()
    738 {
    739 	${{OUTPUT}} = uniformBlock.uniformMember;
    740 }"""[1:]
    741 
    742 invalidDollarBlockNameShaderTemplate = """
    743 #version 300 es
    744 precision highp float;
    745 
    746 ${{OUTPUT_DECLARATION}}
    747 
    748 uniform $UniformBlock
    749 {
    750 	vec4 uniformMember;
    751 } uniformBlock;
    752 
    753 void main()
    754 {
    755 	${{OUTPUT}} = uniformBlock.uniformMember;
    756 }"""[1:]
    757 
    758 invalidIdentifierBlockNameShaderTemplate = """
    759 #version 300 es
    760 precision highp float;
    761 
    762 ${{OUTPUT_DECLARATION}}
    763 
    764 uniform gl_UniformBlock
    765 {
    766 	vec4 uniformMember;
    767 } uniformBlock;
    768 
    769 void main()
    770 {
    771 	${{OUTPUT}} = uniformBlock.uniformMember;
    772 }"""[1:]
    773 
    774 tooLongIdentifierBlockNameShaderTemplate = ("""
    775 #version 300 es
    776 precision highp float;
    777 
    778 ${{OUTPUT_DECLARATION}}
    779 
    780 // Total of 1025 characters
    781 uniform """ + ("a" * 1025) + """
    782 {
    783 	vec4 uniformMember;
    784 } uniformBlock;
    785 
    786 void main()
    787 {
    788 	${{OUTPUT}} = uniformBlock.uniformMember;
    789 }""")[1:]
    790 
    791 invalidNumberInstanceNameShaderTemplate = """
    792 #version 300 es
    793 precision highp float;
    794 
    795 ${{OUTPUT_DECLARATION}}
    796 
    797 uniform UniformInstance
    798 {
    799 	vec4 uniformMember;
    800 } 0uniformBlock;
    801 
    802 void main()
    803 {
    804 	${{OUTPUT}} = 0uniformBlock.uniformMember;
    805 }"""[1:]
    806 
    807 invalidHashInstanceNameShaderTemplate = """
    808 #version 300 es
    809 precision highp float;
    810 
    811 ${{OUTPUT_DECLARATION}}
    812 
    813 uniform UniformInstance
    814 {
    815 	vec4 uniformMember;
    816 } #uniformBlock;
    817 
    818 void main()
    819 {
    820 	${{OUTPUT}} = #uniformBlock.uniformMember;
    821 }"""[1:]
    822 
    823 invalidDollarInstanceNameShaderTemplate = """
    824 #version 300 es
    825 precision highp float;
    826 
    827 ${{OUTPUT_DECLARATION}}
    828 
    829 uniform UniformInstance
    830 {
    831 	vec4 uniformMember;
    832 } $uniformBlock;
    833 
    834 void main()
    835 {
    836 	${{OUTPUT}} = $uniformBlock.uniformMember;
    837 }"""[1:]
    838 
    839 invalidIdentifierInstanceNameShaderTemplate = """
    840 #version 300 es
    841 precision highp float;
    842 
    843 ${{OUTPUT_DECLARATION}}
    844 
    845 uniform UniformBlock
    846 {
    847 	vec4 uniformMember;
    848 } gl_uniformBlock;
    849 
    850 void main()
    851 {
    852 	${{OUTPUT}} = gl_uniformBlock.uniformMember;
    853 }"""[1:]
    854 
    855 tooLongIdentifierInstanceNameShaderTemplate = ("""
    856 #version 300 es
    857 precision highp float;
    858 
    859 ${{OUTPUT_DECLARATION}}
    860 
    861 uniform UniformBlock
    862 {
    863 	vec4 uniformMember;
    864 } """ + ("a" * 1025) + """;
    865 // Total of 1025 characters
    866 
    867 void main()
    868 {
    869 	${{OUTPUT}} = """ + ("a" * 1025) + """.uniformMember;
    870 }""")[1:]
    871 
    872 invalidCases = (
    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)
    903 		)
    904 
    905 allCases.append(CaseGroup("valid", "Valid uniform interface block syntax tests.", validCases))
    906 allCases.append(CaseGroup("invalid", "Invalid uniform interface block syntax tests.", invalidCases))
    907 
    908 if __name__ == "__main__":
    909 	print "Generating shader case files."
    910 	writeAllCases("uniform_block.test", allCases)
    911