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 #-------------------------------------------------------------------------
23 from build.common import *
24 from build.config import ANY_GENERATOR
25 from build.build import build
26 from build_caselists import Module, getBuildConfig, genCaseList, getCaseListPath, DEFAULT_BUILD_DIR, DEFAULT_TARGET
27 from fnmatch import fnmatch
30 import xml.etree.cElementTree as ElementTree
31 import xml.dom.minidom as minidom
33 CTS_DATA_DIR = os.path.join(DEQP_DIR, "android", "cts")
34 APK_NAME = "com.drawelements.deqp.apk"
36 COPYRIGHT_DECLARATION = """
37 Copyright (C) 2015 The Android Open Source Project
39 Licensed under the Apache License, Version 2.0 (the "License");
40 you may not use this file except in compliance with the License.
41 You may obtain a copy of the License at
43 http://www.apache.org/licenses/LICENSE-2.0
45 Unless required by applicable law or agreed to in writing, software
46 distributed under the License is distributed on an "AS IS" BASIS,
47 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
48 See the License for the specific language governing permissions and
49 limitations under the License.
52 GENERATED_FILE_WARNING = """
53 This file has been automatically generated. Edit with caution.
57 def __init__ (self, name, glconfig, rotation, surfacetype, filters):
59 self.glconfig = glconfig
60 self.rotation = rotation
61 self.surfacetype = surfacetype
62 self.filters = filters
65 def __init__ (self, module, configurations):
67 self.configurations = configurations
70 def __init__ (self, version, packages):
71 self.version = version
72 self.packages = packages
78 def __init__ (self, type, filename):
80 self.filename = filename
87 def __init__ (self, name):
92 def __init__ (self, name):
94 self.configurations = []
97 def __init__(self, major, minor):
102 return (self.major << 16) | (self.minor)
104 def getModuleGLESVersion (module):
106 'dEQP-EGL': GLESVersion(2,0),
107 'dEQP-GLES2': GLESVersion(2,0),
108 'dEQP-GLES3': GLESVersion(3,0),
109 'dEQP-GLES31': GLESVersion(3,1)
111 return versions[module.name]
113 def getSrcDir (mustpass):
114 return os.path.join(CTS_DATA_DIR, mustpass.version, "src")
116 def getTmpDir (mustpass):
117 return os.path.join(CTS_DATA_DIR, mustpass.version, "tmp")
119 def getModuleShorthand (module):
120 assert module.name[:5] == "dEQP-"
121 return module.name[5:].lower()
123 def getCaseListFileName (package, configuration):
124 return "%s-%s.txt" % (getModuleShorthand(package.module), configuration.name)
126 def getDstCaseListPath (mustpass, package, configuration):
127 return os.path.join(CTS_DATA_DIR, mustpass.version, getCaseListFileName(package, configuration))
129 def getCTSPackageName (package):
130 return "com.drawelements.deqp." + getModuleShorthand(package.module)
132 def getCommandLine (config):
133 return "--deqp-gl-config-name=%s --deqp-screen-rotation=%s --deqp-surface-type=%s --deqp-watchdog=enable" % (config.glconfig, config.rotation, config.surfacetype)
135 def readCaseList (filename):
137 with open(filename, 'rb') as f:
139 if line[:6] == "TEST: ":
140 cases.append(line[6:].strip())
143 def getCaseList (buildCfg, generator, module):
144 build(buildCfg, generator, [module.binName])
145 genCaseList(buildCfg, generator, module, "txt")
146 return readCaseList(getCaseListPath(buildCfg, module, "txt"))
148 def readPatternList (filename):
150 with open(filename, 'rb') as f:
153 if len(line) > 0 and line[0] != '#':
157 def applyPatterns (caseList, patterns, filename, op):
160 curList = copy(caseList)
161 trivialPtrns = [p for p in patterns if p.find('*') < 0]
162 regularPtrns = [p for p in patterns if p.find('*') >= 0]
164 # Apply trivial (just case paths)
165 allCasesSet = set(caseList)
166 for path in trivialPtrns:
167 if path in allCasesSet:
169 errors.append((path, "Same case specified more than once"))
172 errors.append((path, "Test case not found"))
174 curList = [c for c in curList if c not in matched]
176 for pattern in regularPtrns:
177 matchedThisPtrn = set()
180 if fnmatch(case, pattern):
181 matchedThisPtrn.add(case)
183 if len(matchedThisPtrn) == 0:
184 errors.append((pattern, "Pattern didn't match any cases"))
186 matched = matched | matchedThisPtrn
187 curList = [c for c in curList if c not in matched]
189 for pattern, reason in errors:
190 print "ERROR: %s: %s" % (reason, pattern)
193 die("Found %s invalid patterns while processing file %s" % (len(errors), filename))
195 return [c for c in caseList if op(c in matched)]
197 def applyInclude (caseList, patterns, filename):
198 return applyPatterns(caseList, patterns, filename, lambda b: b)
200 def applyExclude (caseList, patterns, filename):
201 return applyPatterns(caseList, patterns, filename, lambda b: not b)
203 def readPatternLists (mustpass):
205 for package in mustpass.packages:
206 for cfg in package.configurations:
207 for filter in cfg.filters:
208 if not filter.filename in lists:
209 lists[filter.filename] = readPatternList(os.path.join(getSrcDir(mustpass), filter.filename))
212 def applyFilters (caseList, patternLists, filters):
214 for filter in filters:
215 ptrnList = patternLists[filter.filename]
216 if filter.type == Filter.TYPE_INCLUDE:
217 res = applyInclude(res, ptrnList, filter.filename)
219 assert filter.type == Filter.TYPE_EXCLUDE
220 res = applyExclude(res, ptrnList, filter.filename)
223 def appendToHierarchy (root, casePath):
224 def findChild (node, name):
225 for child in node.children:
226 if child.name == name:
231 components = casePath.split('.')
233 for component in components[:-1]:
234 nextNode = findChild(curNode, component)
236 nextNode = TestGroup(component)
237 curNode.children.append(nextNode)
240 if not findChild(curNode, components[-1]):
241 curNode.children.append(TestCase(components[-1]))
243 def buildTestHierachy (caseList):
245 for case in caseList:
246 appendToHierarchy(root, case)
249 def buildTestCaseMap (root):
252 def recursiveBuild (curNode, prefix):
253 curPath = prefix + curNode.name
254 if isinstance(curNode, TestCase):
255 caseMap[curPath] = curNode
257 for child in curNode.children:
258 recursiveBuild(child, curPath + '.')
260 for child in root.children:
261 recursiveBuild(child, '')
265 def include (filename):
266 return Filter(Filter.TYPE_INCLUDE, filename)
268 def exclude (filename):
269 return Filter(Filter.TYPE_EXCLUDE, filename)
271 def prettifyXML (doc):
272 doc.insert(0, ElementTree.Comment(COPYRIGHT_DECLARATION))
273 doc.insert(1, ElementTree.Comment(GENERATED_FILE_WARNING))
274 uglyString = ElementTree.tostring(doc, 'utf-8')
275 reparsed = minidom.parseString(uglyString)
276 return reparsed.toprettyxml(indent='\t', encoding='utf-8')
278 def genCTSPackageXML (package, root):
279 def isLeafGroup (testGroup):
283 for child in testGroup.children:
284 if isinstance(child, TestCase):
289 assert numGroups + numTests > 0
291 if numGroups > 0 and numTests > 0:
292 die("Mixed groups and cases in %s" % testGroup.name)
294 return numGroups == 0
296 def makeConfiguration (parentElem, configuration):
297 return ElementTree.SubElement(parentElem, "TestInstance", glconfig=configuration.glconfig, rotation=configuration.rotation, surfacetype=configuration.surfacetype)
299 def makeTestCase (parentElem, testCase):
300 caseElem = ElementTree.SubElement(parentElem, "Test", name=testCase.name)
301 for config in testCase.configurations:
302 makeConfiguration(caseElem, config)
305 def makeTestGroup (parentElem, testGroup):
306 groupElem = ElementTree.SubElement(parentElem, "TestCase" if isLeafGroup(testGroup) else "TestSuite", name=testGroup.name)
307 for child in testGroup.children:
308 if isinstance(child, TestCase):
309 makeTestCase(groupElem, child)
311 makeTestGroup(groupElem, child)
314 pkgElem = ElementTree.Element("TestPackage",
315 name = package.module.name,
316 appPackageName = getCTSPackageName(package),
317 testType = "deqpTest")
319 pkgElem.set("xmlns:deqp", "http://drawelements.com/deqp")
320 pkgElem.set("deqp:glesVersion", str(getModuleGLESVersion(package.module).encode()))
322 for child in root.children:
323 makeTestGroup(pkgElem, child)
327 def genSpecXML (mustpass):
328 mustpassElem = ElementTree.Element("Mustpass", version = mustpass.version)
330 for package in mustpass.packages:
331 packageElem = ElementTree.SubElement(mustpassElem, "TestPackage", name = package.module.name)
333 for config in package.configurations:
334 configElem = ElementTree.SubElement(packageElem, "Configuration",
336 caseListFile = getCaseListFileName(package, config),
337 commandLine = getCommandLine(config))
341 def addOptionElement (parent, optionName, optionValue):
342 ElementTree.SubElement(parent, "option", name=optionName, value=optionValue)
344 def genAndroidTestXml (mustpass):
345 INSTALLER_CLASS = "com.android.compatibility.common.tradefed.targetprep.ApkInstaller"
346 RUNNER_CLASS = "com.drawelements.deqp.runner.DeqpTestRunner"
347 configElement = ElementTree.Element("configuration")
348 preparerElement = ElementTree.SubElement(configElement, "target_preparer")
349 preparerElement.set("class", INSTALLER_CLASS)
350 addOptionElement(preparerElement, "cleanup-apks", "true")
351 addOptionElement(preparerElement, "test-file-name", APK_NAME)
353 for package in mustpass.packages:
354 for config in package.configurations:
355 testElement = ElementTree.SubElement(configElement, "test")
356 testElement.set("class", RUNNER_CLASS)
357 addOptionElement(testElement, "deqp-package", package.module.name)
358 addOptionElement(testElement, "deqp-caselist-file", getCaseListFileName(package,config))
359 # \todo [2015-10-16 kalle]: Replace with just command line? - requires simplifications in the runner/tests as well.
360 addOptionElement(testElement, "deqp-gl-config-name", config.glconfig)
361 addOptionElement(testElement, "deqp-surface-type", config.surfacetype)
362 addOptionElement(testElement, "deqp-screen-rotation", config.rotation)
367 def genMustpass (mustpass, moduleCaseLists):
368 print "Generating mustpass '%s'" % mustpass.version
370 patternLists = readPatternLists(mustpass)
372 for package in mustpass.packages:
373 allCasesInPkg = moduleCaseLists[package.module]
374 matchingByConfig = {}
375 allMatchingSet = set()
377 for config in package.configurations:
378 filtered = applyFilters(allCasesInPkg, patternLists, config.filters)
379 dstFile = getDstCaseListPath(mustpass, package, config)
381 print " Writing deqp caselist: " + dstFile
382 writeFile(dstFile, "\n".join(filtered) + "\n")
384 matchingByConfig[config] = filtered
385 allMatchingSet = allMatchingSet | set(filtered)
387 allMatchingCases = [c for c in allCasesInPkg if c in allMatchingSet] # To preserve ordering
388 root = buildTestHierachy(allMatchingCases)
389 testCaseMap = buildTestCaseMap(root)
391 for config in package.configurations:
392 for case in matchingByConfig[config]:
393 testCaseMap[case].configurations.append(config)
395 # NOTE: CTS v2 does not need package XML files. Remove when transition is complete.
396 packageXml = genCTSPackageXML(package, root)
397 xmlFilename = os.path.join(CTS_DATA_DIR, mustpass.version, getCTSPackageName(package) + ".xml")
399 print " Writing CTS caselist: " + xmlFilename
400 writeFile(xmlFilename, prettifyXML(packageXml))
402 specXML = genSpecXML(mustpass)
403 specFilename = os.path.join(CTS_DATA_DIR, mustpass.version, "mustpass.xml")
405 print " Writing spec: " + specFilename
406 writeFile(specFilename, prettifyXML(specXML))
408 # TODO: Which is the best selector mechanism?
409 if (mustpass.version == "mnc"):
410 androidTestXML = genAndroidTestXml(mustpass)
411 androidTestFilename = os.path.join(CTS_DATA_DIR, "AndroidTest.xml")
413 print " Writing AndroidTest.xml: " + androidTestFilename
414 writeFile(androidTestFilename, prettifyXML(androidTestXML))
418 def genMustpassLists (mustpassLists, generator, buildCfg):
421 # Getting case lists involves invoking build, so we want to cache the results
422 for mustpass in mustpassLists:
423 for package in mustpass.packages:
424 if not package.module in moduleCaseLists:
425 moduleCaseLists[package.module] = getCaseList(buildCfg, generator, package.module)
427 for mustpass in mustpassLists:
428 genMustpass(mustpass, moduleCaseLists)
430 EGL_MODULE = Module(name = "dEQP-EGL", dirName = "egl", binName = "deqp-egl")
431 GLES2_MODULE = Module(name = "dEQP-GLES2", dirName = "gles2", binName = "deqp-gles2")
432 GLES3_MODULE = Module(name = "dEQP-GLES3", dirName = "gles3", binName = "deqp-gles3")
433 GLES31_MODULE = Module(name = "dEQP-GLES31", dirName = "gles31", binName = "deqp-gles31")
437 LMP_GLES3_PKG = Package(module = GLES3_MODULE, configurations = [
438 Configuration(name = "master",
439 glconfig = "rgba8888d24s8ms0",
440 rotation = "unspecified",
441 surfacetype = "window",
442 filters = [include("es30-lmp.txt")]),
444 LMP_GLES31_PKG = Package(module = GLES31_MODULE, configurations = [
445 Configuration(name = "master",
446 glconfig = "rgba8888d24s8ms0",
447 rotation = "unspecified",
448 surfacetype = "window",
449 filters = [include("es31-lmp.txt")]),
454 LMP_MR1_GLES3_PKG = Package(module = GLES3_MODULE, configurations = [
455 Configuration(name = "master",
456 glconfig = "rgba8888d24s8ms0",
457 rotation = "unspecified",
458 surfacetype = "window",
459 filters = [include("es30-lmp-mr1.txt")]),
461 LMP_MR1_GLES31_PKG = Package(module = GLES31_MODULE, configurations = [
462 Configuration(name = "master",
463 glconfig = "rgba8888d24s8ms0",
464 rotation = "unspecified",
465 surfacetype = "window",
466 filters = [include("es31-lmp-mr1.txt")]),
471 MNC_EGL_PKG = Package(module = EGL_MODULE, configurations = [
473 Configuration(name = "master",
474 glconfig = "rgba8888d24s8ms0",
475 rotation = "unspecified",
476 surfacetype = "window",
477 filters = [include("egl-master.txt")]),
479 MNC_GLES2_PKG = Package(module = GLES2_MODULE, configurations = [
481 Configuration(name = "master",
482 glconfig = "rgba8888d24s8ms0",
483 rotation = "unspecified",
484 surfacetype = "window",
485 filters = [include("gles2-master.txt")]),
487 MNC_GLES3_PKG = Package(module = GLES3_MODULE, configurations = [
489 Configuration(name = "master",
490 glconfig = "rgba8888d24s8ms0",
491 rotation = "unspecified",
492 surfacetype = "window",
493 filters = [include("gles3-master.txt")]),
495 Configuration(name = "rotate-portrait",
496 glconfig = "rgba8888d24s8ms0",
498 surfacetype = "window",
499 filters = [include("gles3-master.txt"), include("gles3-rotation.txt")]),
500 Configuration(name = "rotate-landscape",
501 glconfig = "rgba8888d24s8ms0",
503 surfacetype = "window",
504 filters = [include("gles3-master.txt"), include("gles3-rotation.txt")]),
505 Configuration(name = "rotate-reverse-portrait",
506 glconfig = "rgba8888d24s8ms0",
508 surfacetype = "window",
509 filters = [include("gles3-master.txt"), include("gles3-rotation.txt")]),
510 Configuration(name = "rotate-reverse-landscape",
511 glconfig = "rgba8888d24s8ms0",
513 surfacetype = "window",
514 filters = [include("gles3-master.txt"), include("gles3-rotation.txt")]),
517 Configuration(name = "multisample",
518 glconfig = "rgba8888d24s8ms4",
519 rotation = "unspecified",
520 surfacetype = "window",
521 filters = [include("gles3-master.txt"),
522 include("gles3-multisample.txt"),
523 exclude("gles3-multisample-issues.txt")]),
526 Configuration(name = "565-no-depth-no-stencil",
527 glconfig = "rgb565d0s0ms0",
528 rotation = "unspecified",
529 surfacetype = "window",
530 filters = [include("gles3-master.txt"),
531 include("gles3-pixelformat.txt"),
532 exclude("gles3-pixelformat-issues.txt")]),
534 MNC_GLES31_PKG = Package(module = GLES31_MODULE, configurations = [
536 Configuration(name = "master",
537 glconfig = "rgba8888d24s8ms0",
538 rotation = "unspecified",
539 surfacetype = "window",
540 filters = [include("gles31-master.txt")]),
543 Configuration(name = "rotate-portrait",
544 glconfig = "rgba8888d24s8ms0",
546 surfacetype = "window",
547 filters = [include("gles31-master.txt"), include("gles31-rotation.txt")]),
548 Configuration(name = "rotate-landscape",
549 glconfig = "rgba8888d24s8ms0",
551 surfacetype = "window",
552 filters = [include("gles31-master.txt"), include("gles31-rotation.txt")]),
553 Configuration(name = "rotate-reverse-portrait",
554 glconfig = "rgba8888d24s8ms0",
556 surfacetype = "window",
557 filters = [include("gles31-master.txt"), include("gles31-rotation.txt")]),
558 Configuration(name = "rotate-reverse-landscape",
559 glconfig = "rgba8888d24s8ms0",
561 surfacetype = "window",
562 filters = [include("gles31-master.txt"), include("gles31-rotation.txt")]),
565 Configuration(name = "multisample",
566 glconfig = "rgba8888d24s8ms4",
567 rotation = "unspecified",
568 surfacetype = "window",
569 filters = [include("gles31-master.txt"), include("gles31-multisample.txt")]),
572 Configuration(name = "565-no-depth-no-stencil",
573 glconfig = "rgb565d0s0ms0",
574 rotation = "unspecified",
575 surfacetype = "window",
576 filters = [include("gles31-master.txt"), include("gles31-pixelformat.txt")]),
581 MASTER_EGL_COMMON_FILTERS = [include("egl-master.txt")]
582 MASTER_EGL_PKG = Package(module = EGL_MODULE, configurations = [
584 Configuration(name = "master",
585 glconfig = "rgba8888d24s8ms0",
586 rotation = "unspecified",
587 surfacetype = "window",
588 filters = MASTER_EGL_COMMON_FILTERS),
591 MASTER_GLES2_COMMON_FILTERS = [
592 include("gles2-master.txt"),
593 exclude("gles2-test-issues.txt"),
594 exclude("gles2-failures.txt")
596 MASTER_GLES2_PKG = Package(module = GLES2_MODULE, configurations = [
598 Configuration(name = "master",
599 glconfig = "rgba8888d24s8ms0",
600 rotation = "unspecified",
601 surfacetype = "window",
602 filters = MASTER_GLES2_COMMON_FILTERS),
605 MASTER_GLES3_COMMON_FILTERS = [
606 include("gles3-master.txt"),
607 exclude("gles3-hw-issues.txt"),
608 exclude("gles3-driver-issues.txt"),
609 exclude("gles3-test-issues.txt"),
610 exclude("gles3-spec-issues.txt")
612 MASTER_GLES3_PKG = Package(module = GLES3_MODULE, configurations = [
614 Configuration(name = "master",
615 glconfig = "rgba8888d24s8ms0",
616 rotation = "unspecified",
617 surfacetype = "window",
618 filters = MASTER_GLES3_COMMON_FILTERS),
620 Configuration(name = "rotate-portrait",
621 glconfig = "rgba8888d24s8ms0",
623 surfacetype = "window",
624 filters = MASTER_GLES3_COMMON_FILTERS + [include("gles3-rotation.txt")]),
625 Configuration(name = "rotate-landscape",
626 glconfig = "rgba8888d24s8ms0",
628 surfacetype = "window",
629 filters = MASTER_GLES3_COMMON_FILTERS + [include("gles3-rotation.txt")]),
630 Configuration(name = "rotate-reverse-portrait",
631 glconfig = "rgba8888d24s8ms0",
633 surfacetype = "window",
634 filters = MASTER_GLES3_COMMON_FILTERS + [include("gles3-rotation.txt")]),
635 Configuration(name = "rotate-reverse-landscape",
636 glconfig = "rgba8888d24s8ms0",
638 surfacetype = "window",
639 filters = MASTER_GLES3_COMMON_FILTERS + [include("gles3-rotation.txt")]),
642 Configuration(name = "multisample",
643 glconfig = "rgba8888d24s8ms4",
644 rotation = "unspecified",
645 surfacetype = "window",
646 filters = MASTER_GLES3_COMMON_FILTERS + [include("gles3-multisample.txt"),
647 exclude("gles3-multisample-issues.txt")]),
650 Configuration(name = "565-no-depth-no-stencil",
651 glconfig = "rgb565d0s0ms0",
652 rotation = "unspecified",
653 surfacetype = "window",
654 filters = MASTER_GLES3_COMMON_FILTERS + [include("gles3-pixelformat.txt"),
655 exclude("gles3-pixelformat-issues.txt")]),
658 MASTER_GLES31_COMMON_FILTERS = [
659 include("gles31-master.txt"),
660 exclude("gles31-hw-issues.txt"),
661 exclude("gles31-driver-issues.txt"),
662 exclude("gles31-test-issues.txt"),
663 exclude("gles31-spec-issues.txt"),
665 MASTER_GLES31_PKG = Package(module = GLES31_MODULE, configurations = [
667 Configuration(name = "master",
668 glconfig = "rgba8888d24s8ms0",
669 rotation = "unspecified",
670 surfacetype = "window",
671 filters = MASTER_GLES31_COMMON_FILTERS),
674 Configuration(name = "rotate-portrait",
675 glconfig = "rgba8888d24s8ms0",
677 surfacetype = "window",
678 filters = MASTER_GLES31_COMMON_FILTERS + [include("gles31-rotation.txt")]),
679 Configuration(name = "rotate-landscape",
680 glconfig = "rgba8888d24s8ms0",
682 surfacetype = "window",
683 filters = MASTER_GLES31_COMMON_FILTERS + [include("gles31-rotation.txt")]),
684 Configuration(name = "rotate-reverse-portrait",
685 glconfig = "rgba8888d24s8ms0",
687 surfacetype = "window",
688 filters = MASTER_GLES31_COMMON_FILTERS + [include("gles31-rotation.txt")]),
689 Configuration(name = "rotate-reverse-landscape",
690 glconfig = "rgba8888d24s8ms0",
692 surfacetype = "window",
693 filters = MASTER_GLES31_COMMON_FILTERS + [include("gles31-rotation.txt")]),
696 Configuration(name = "multisample",
697 glconfig = "rgba8888d24s8ms4",
698 rotation = "unspecified",
699 surfacetype = "window",
700 filters = MASTER_GLES31_COMMON_FILTERS + [include("gles31-multisample.txt")]),
703 Configuration(name = "565-no-depth-no-stencil",
704 glconfig = "rgb565d0s0ms0",
705 rotation = "unspecified",
706 surfacetype = "window",
707 filters = MASTER_GLES31_COMMON_FILTERS + [include("gles31-pixelformat.txt")]),
711 Mustpass(version = "lmp", packages = [LMP_GLES3_PKG, LMP_GLES31_PKG]),
712 Mustpass(version = "lmp-mr1", packages = [LMP_MR1_GLES3_PKG, LMP_MR1_GLES31_PKG]),
713 Mustpass(version = "mnc", packages = [MNC_EGL_PKG, MNC_GLES2_PKG, MNC_GLES3_PKG, MNC_GLES31_PKG]),
714 Mustpass(version = "master", packages = [MASTER_EGL_PKG, MASTER_GLES2_PKG, MASTER_GLES3_PKG, MASTER_GLES31_PKG])
717 if __name__ == "__main__":
718 genMustpassLists(MUSTPASS_LISTS, ANY_GENERATOR, getBuildConfig(DEFAULT_BUILD_DIR, DEFAULT_TARGET, "Debug"))