13c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport sys
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfrom genutil import *
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# \todo [arttu 2012-12-20] Current set tests variable names only, add function names, structure names, and field selectors.
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Templates
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
83c827367444ee418f129b2c238299f49d3264554Jarkko PoyryidentifierCaseTemplate = """
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyrycase ${{NAME}}
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	expect compile_fail
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	values {}
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	version 300 es
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	both ""
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		#version 300 es
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		precision mediump float;
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		${DECLARATIONS}
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		void main()
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			${SETUP}
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float ${{IDENTIFIER}} = 1.0;
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			${OUTPUT}
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	""
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryend
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"""[1:-1]
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Classes
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass IdentifierCase(ShaderCase):
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, name, identifier):
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.name 		= name
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.identifier = identifier
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		params = { 	"NAME"			: self.name,
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					"IDENTIFIER"	: self.identifier }
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return fillTemplate(identifierCaseTemplate, params)
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Declarations
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c827367444ee418f129b2c238299f49d3264554Jarkko PoyryKEYWORDS = [
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"const", "uniform",	"layout", "centroid", "flat", "smooth",	"break", "continue", "do",
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"for", "while", "switch", "case", "default","if", "else", "in", "out", "inout",	"float",
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"int", "void", "bool", "true", "false", "invariant", "discard", "return", "mat2", "mat3",
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"mat4",	"mat2x2", "mat2x3", "mat2x4", "mat3x2", "mat3x3", "mat3x4", "mat4x2", "mat4x3", "mat4x4",
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"vec2", "vec3", "vec4", "ivec2", "ivec3", "ivec4", "bvec2", "bvec3", "bvec4", "uint", "uvec2",
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"uvec3", "uvec4", "lowp", "mediump", "highp", "precision", "sampler2D", "sampler3D", "samplerCube",
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"sampler2DShadow", "samplerCubeShadow", "sampler2DArray", "sampler2DArrayShadow", "isampler2D",
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"isampler3D", "isamplerCube", "isampler2DArray", "usampler2D", "usampler3D", "usamplerCube",
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"usampler2DArray", "struct"
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry]
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko PoyryRESERVED_KEYWORDS = [
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"attribute", "varying", "coherent", "restrict", "readonly", "writeonly",
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"resource", "atomic_uint", "noperspective",	"patch", "sample", "subroutine", "common",
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"partition", "active", "asm", "class", "union", "enum", "typedef", "template", "this",
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"goto", "inline", "noinline", "volatile", "public", "static", "extern", "external", "interface",
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"long", "short", "double", "half", "fixed", "unsigned", "superp", "input", "output",
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"hvec2", "hvec3", "hvec4", "dvec2", "dvec3", "dvec4", "fvec2", "fvec3", "fvec4", "sampler3DRect",
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"filter", "image1D", "image2D", "image3D", "imageCube", "iimage1D", "iimage2D", "iimage3D",
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"iimageCube", "uimage1D", "uimage2D", "uimage3D", "uimageCube", "image1DArray", "image2DArray",
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"iimage1DArray", "iimage2DArray", "uimage1DArray", "uimage2DArray", "image1DShadow", "image2DShadow",
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"image1DArrayShadow", "image2DArrayShadow", "imageBuffer", "iimageBuffer", "uimageBuffer",
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"sampler1D", "sampler1DShadow", "sampler1DArray", "sampler1DArrayShadow", "isampler1D",
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"isampler1DArray", "usampler1D", "usampler1DArray", "sampler2DRect", "sampler2DRectShadow",
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"isampler2DRect", "usampler2DRect", "samplerBuffer", "isamplerBuffer", "usamplerBuffer",
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"sampler2DMS", "isampler2DMS", "usampler2DMS", "sampler2DMSArray", "isampler2DMSArray",
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"usampler2DMSArray", "sizeof", "cast", "namespace", "using"
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry]
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
733c827367444ee418f129b2c238299f49d3264554Jarkko PoyryINVALID_IDENTIFIERS = [
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	("two_underscores_begin", 	"__invalid"),
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	("two_underscores_middle", 	"in__valid"),
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	("two_underscores_end",		"invalid__"),
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	("gl_begin", 				"gl_Invalid"),
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	("digit", 					"0123"),
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	("digit_begin",				"0invalid"),
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	("max_length",				"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdX"),
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry]
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Keyword usage
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyrykeywords 			= []
863c827367444ee418f129b2c238299f49d3264554Jarkko PoyryreservedKeywords 	= []
873c827367444ee418f129b2c238299f49d3264554Jarkko PoyryinvalidIdentifiers 	= []
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfor keyword in KEYWORDS:
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	keywords.append(IdentifierCase(keyword, keyword)) 			# Keywords
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfor keyword in RESERVED_KEYWORDS:
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	reservedKeywords.append(IdentifierCase(keyword, keyword))	# Reserved keywords
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryfor (name, identifier) in INVALID_IDENTIFIERS:
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	invalidIdentifiers.append(IdentifierCase(name, identifier)) # Invalid identifiers
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
983c827367444ee418f129b2c238299f49d3264554Jarkko PoyrykeywordCases = [
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CaseGroup("keywords", 				"Usage of keywords as identifiers.", 			keywords),
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CaseGroup("reserved_keywords",		"Usage of reserved keywords as identifiers.", 	reservedKeywords),
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CaseGroup("invalid_identifiers",	"Usage of invalid identifiers.", 				invalidIdentifiers)
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry]
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Main program
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryif __name__ == "__main__":
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	print "Generating shader case files."
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	writeAllCases("keywords.test", keywordCases)
109