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 23import sys 24from genutil import * 25 26# \todo [arttu 2012-12-20] Current set tests variable names only, add function names, structure names, and field selectors. 27 28# Templates 29 30identifierCaseTemplate = """ 31case ${{NAME}} 32 ${{EXPECT}} 33 values {} 34 version 300 es 35 36 both "" 37 #version 300 es 38 precision mediump float; 39 ${DECLARATIONS} 40 41 void main() 42 { 43 ${SETUP} 44 float ${{IDENTIFIER}} = 1.0; 45 ${OUTPUT} 46 } 47 "" 48end 49"""[1:-1] 50 51# Classes 52 53class IdentifierCase(ShaderCase): 54 def __init__(self, name, identifier, expectToCompile = True): 55 self.name = name 56 self.identifier = identifier 57 self.expect = '' if expectToCompile else 'expect compile_fail' 58 59 def __str__(self): 60 params = { "NAME" : self.name, 61 "IDENTIFIER" : self.identifier, 62 "EXPECT" : self.expect } 63 return fillTemplate(identifierCaseTemplate, params) 64 65# Declarations 66 67KEYWORDS = [ 68 "const", "uniform", "layout", "centroid", "flat", "smooth", "break", "continue", "do", 69 "for", "while", "switch", "case", "default","if", "else", "in", "out", "inout", "float", 70 "int", "void", "bool", "true", "false", "invariant", "discard", "return", "mat2", "mat3", 71 "mat4", "mat2x2", "mat2x3", "mat2x4", "mat3x2", "mat3x3", "mat3x4", "mat4x2", "mat4x3", "mat4x4", 72 "vec2", "vec3", "vec4", "ivec2", "ivec3", "ivec4", "bvec2", "bvec3", "bvec4", "uint", "uvec2", 73 "uvec3", "uvec4", "lowp", "mediump", "highp", "precision", "sampler2D", "sampler3D", "samplerCube", 74 "sampler2DShadow", "samplerCubeShadow", "sampler2DArray", "sampler2DArrayShadow", "isampler2D", 75 "isampler3D", "isamplerCube", "isampler2DArray", "usampler2D", "usampler3D", "usamplerCube", 76 "usampler2DArray", "struct" 77] 78 79RESERVED_KEYWORDS = [ 80 "attribute", "varying", "coherent", "restrict", "readonly", "writeonly", 81 "resource", "atomic_uint", "noperspective", "patch", "sample", "subroutine", "common", 82 "partition", "active", "asm", "class", "union", "enum", "typedef", "template", "this", 83 "goto", "inline", "noinline", "volatile", "public", "static", "extern", "external", "interface", 84 "long", "short", "double", "half", "fixed", "unsigned", "superp", "input", "output", 85 "hvec2", "hvec3", "hvec4", "dvec2", "dvec3", "dvec4", "fvec2", "fvec3", "fvec4", "sampler3DRect", 86 "filter", "image1D", "image2D", "image3D", "imageCube", "iimage1D", "iimage2D", "iimage3D", 87 "iimageCube", "uimage1D", "uimage2D", "uimage3D", "uimageCube", "image1DArray", "image2DArray", 88 "iimage1DArray", "iimage2DArray", "uimage1DArray", "uimage2DArray", 89 "imageBuffer", "iimageBuffer", "uimageBuffer", 90 "sampler1D", "sampler1DShadow", "sampler1DArray", "sampler1DArrayShadow", "isampler1D", 91 "isampler1DArray", "usampler1D", "usampler1DArray", "sampler2DRect", "sampler2DRectShadow", 92 "isampler2DRect", "usampler2DRect", "samplerBuffer", "isamplerBuffer", "usamplerBuffer", 93 "sampler2DMS", "isampler2DMS", "usampler2DMS", "sampler2DMSArray", "isampler2DMSArray", 94 "usampler2DMSArray", "sizeof", "cast", "namespace", "using" 95] 96 97ALLOWED_KEYWORDS = [ 98 "image1DShadow", "image2DShadow", "image1DArrayShadow", "image2DArrayShadow" 99] 100 101INVALID_IDENTIFIERS = [ 102 ("gl_begin", "gl_Invalid"), 103 ("digit", "0123"), 104 ("digit_begin", "0invalid"), 105 ("max_length", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdX"), 106] 107 108# Keyword usage 109 110keywords = [] 111reservedKeywords = [] 112allowedKeywords = [] 113invalidIdentifiers = [] 114 115for keyword in KEYWORDS: 116 keywords.append(IdentifierCase(keyword, keyword, False)) # Keywords 117 118for keyword in RESERVED_KEYWORDS: 119 reservedKeywords.append(IdentifierCase(keyword, keyword, False)) # Reserved keywords 120 121for keyword in ALLOWED_KEYWORDS: 122 allowedKeywords.append(IdentifierCase(keyword, keyword, True)) # Allowed keywords 123 124for (name, identifier) in INVALID_IDENTIFIERS: 125 invalidIdentifiers.append(IdentifierCase(name, identifier, False)) # Invalid identifiers 126 127keywordCases = [ 128 CaseGroup("keywords", "Usage of keywords as identifiers.", keywords), 129 CaseGroup("reserved_keywords", "Usage of reserved keywords as identifiers.", reservedKeywords), 130 CaseGroup("allowed_keywords", "Usage of allowed keywords as identifiers.", allowedKeywords), 131 CaseGroup("invalid_identifiers", "Usage of invalid identifiers.", invalidIdentifiers) 132] 133 134# Main program 135 136if __name__ == "__main__": 137 print("Generating shader case files.") 138 writeAllCases("keywords.test", keywordCases) 139