blob: f2dd1d9a9c2f500fe2315d5a66e15d16a94f9016 [file] [log] [blame]
Pyry Haulos1abab602014-11-05 17:41:42 -08001# -*- coding: utf-8 -*-
2
Jarkko Pöyry3c77ed42015-01-06 12:54:34 -08003#-------------------------------------------------------------------------
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
Pyry Haulos1abab602014-11-05 17:41:42 -080023import os
24import re
Pyry Haulosa0178632014-11-21 14:56:21 -080025import sys
Pyry Haulos1abab602014-11-05 17:41:42 -080026
Pyry Haulosa0178632014-11-21 14:56:21 -080027sys.path.append(os.path.dirname(os.path.dirname(__file__)))
28
29import khr_util.format
30import khr_util.registry
31import khr_util.registry_cache
Pyry Haulos1abab602014-11-05 17:41:42 -080032
33SCRIPTS_DIR = os.path.dirname(__file__)
34OPENGL_DIR = os.path.normpath(os.path.join(SCRIPTS_DIR, "..", "..", "framework", "opengl"))
35EGL_DIR = os.path.normpath(os.path.join(SCRIPTS_DIR, "..", "..", "framework", "egl"))
Pyry Haulos1abab602014-11-05 17:41:42 -080036OPENGL_INC_DIR = os.path.join(OPENGL_DIR, "wrapper")
Pyry Haulos1abab602014-11-05 17:41:42 -080037
Pyry Haulosa0178632014-11-21 14:56:21 -080038GL_SOURCE = khr_util.registry_cache.RegistrySource(
39 "gl.xml",
Daniel Andrade Groppe485a2d12015-12-02 15:45:41 -060040 32093,
41 "3292120320cacbc27009e7507656d7be17bb25f06876814c67eeffa369281eed")
Pyry Haulos1abab602014-11-05 17:41:42 -080042
43EXTENSIONS = [
44 'GL_KHR_texture_compression_astc_ldr',
45 'GL_KHR_blend_equation_advanced',
46 'GL_KHR_blend_equation_advanced_coherent',
47 'GL_KHR_debug',
48 'GL_EXT_geometry_point_size',
49 'GL_EXT_tessellation_shader',
50 'GL_EXT_geometry_shader',
Alexander Galazind99ba132017-02-23 13:01:18 +010051 'GL_EXT_robustness',
Pyry Haulos1abab602014-11-05 17:41:42 -080052 'GL_EXT_texture_buffer',
53 'GL_EXT_texture_snorm',
Jarkko Pöyry1f99d692014-11-17 14:21:54 -080054 'GL_EXT_primitive_bounding_box',
Pyry Haulos1abab602014-11-05 17:41:42 -080055 'GL_OES_EGL_image',
56 'GL_OES_compressed_ETC1_RGB8_texture',
57 'GL_OES_texture_half_float',
58 'GL_OES_texture_storage_multisample_2d_array',
59 'GL_OES_sample_shading',
Jarkko Pöyryeb0aaf22014-12-16 14:11:01 -080060 'GL_EXT_texture_compression_s3tc',
61 'GL_IMG_texture_compression_pvrtc',
Mika Isojärvi13e452c2015-01-08 16:11:32 -080062 'GL_EXT_copy_image',
Jarkko Pöyry7af3c6f2015-02-12 15:27:33 -080063 'GL_EXT_draw_buffers_indexed',
64 'GL_EXT_texture_sRGB_decode',
65 'GL_EXT_texture_border_clamp',
Jarkko Pöyry8bf16f22015-03-17 13:48:45 -070066 'GL_EXT_texture_sRGB_R8',
67 'GL_EXT_texture_sRGB_RG8',
Pyry Haulos1a9576a2015-05-20 15:36:20 -070068 'GL_EXT_debug_marker',
Mika Isojärvi68cdd492016-03-10 13:35:20 -080069 'GL_EXT_robustness',
70 'GL_KHR_robustness',
Pyry Haulos1abab602014-11-05 17:41:42 -080071]
72
Pyry Haulos1abab602014-11-05 17:41:42 -080073def getGLRegistry ():
Pyry Haulosa0178632014-11-21 14:56:21 -080074 return khr_util.registry_cache.getRegistry(GL_SOURCE)
Pyry Haulos1abab602014-11-05 17:41:42 -080075
76# return the name of a core command corresponding to an extension command.
77# Ideally this should be done using the alias attribute of commands, but dEQP
78# just strips the extension suffix.
79def getCoreName (name):
80 return re.sub('[A-Z]+$', '', name)
81
82def getHybridInterface ():
83 # This is a bit awkward, since we have to create a strange hybrid
84 # interface that includes both GL and ES features and extensions.
85 registry = getGLRegistry()
86 glFeatures = registry.getFeatures('gl')
87 esFeatures = registry.getFeatures('gles2')
Pyry Haulosa0178632014-11-21 14:56:21 -080088 spec = khr_util.registry.InterfaceSpec()
Pyry Haulos1abab602014-11-05 17:41:42 -080089
90 for feature in registry.getFeatures('gl'):
91 spec.addFeature(feature, 'gl', 'core')
92
93 for feature in registry.getFeatures('gles2'):
94 spec.addFeature(feature, 'gles2')
95
96 for extName in EXTENSIONS:
97 extension = registry.extensions[extName]
98 # Add all extensions using the ES2 api, but force even non-ES2
99 # extensions to be included.
100 spec.addExtension(extension, 'gles2', 'core', force=True)
101
102 # Remove redundant extension commands that are already provided by core.
103 for commandName in list(spec.commands):
104 coreName = getCoreName(commandName)
105 if coreName != commandName and coreName in spec.commands:
106 spec.commands.remove(commandName)
107
Pyry Haulosa0178632014-11-21 14:56:21 -0800108 return khr_util.registry.createInterface(registry, spec, 'gles2')
Pyry Haulos1abab602014-11-05 17:41:42 -0800109
110def getInterface (registry, api, version=None, profile=None, **kwargs):
Pyry Haulosa0178632014-11-21 14:56:21 -0800111 spec = khr_util.registry.spec(registry, api, version, profile, **kwargs)
Pyry Haulos1abab602014-11-05 17:41:42 -0800112 if api == 'gl' and profile == 'core' and version < "3.2":
113 gl32 = registry.features['GL_VERSION_3_2']
114 for eRemove in gl32.xpath('remove'):
115 spec.addComponent(eRemove)
Pyry Haulosa0178632014-11-21 14:56:21 -0800116 return khr_util.registry.createInterface(registry, spec, api)
Pyry Haulos1abab602014-11-05 17:41:42 -0800117
118def getVersionToken (api, version):
119 prefixes = { 'gles2': "ES", 'gl': "GL" }
120 return prefixes[api] + version.replace(".", "")
121
122def genCommandList(iface, renderCommand, directory, filename, align=False):
123 lines = map(renderCommand, iface.commands)
124 if align:
125 lines = indentLines(lines)
126 writeInlFile(os.path.join(directory, filename), lines)
127
128def genCommandLists(registry, renderCommand, check, directory, filePattern, align=False):
129 for eFeature in registry.features:
130 api = eFeature.get('api')
131 version = eFeature.get('number')
132 profile = check(api, version)
133 if profile is True:
134 profile = None
135 elif profile is False:
136 continue
137 iface = getInterface(registry, api, version=version, profile=profile)
138 filename = filePattern % getVersionToken(api, version)
139 genCommandList(iface, renderCommand, directory, filename, align)
140
141def getFunctionTypeName (funcName):
142 return "%sFunc" % funcName
143
144def getFunctionMemberName (funcName):
145 assert funcName[:2] == "gl"
146 if funcName[:5] == "glEGL":
147 # Otherwise we end up with gl.eGLImage...
148 return "egl%s" % funcName[5:]
149 else:
150 return "%c%s" % (funcName[2].lower(), funcName[3:])
151
Pyry Haulosa0178632014-11-21 14:56:21 -0800152INL_HEADER = khr_util.format.genInlHeader("Khronos GL API description (gl.xml)", GL_SOURCE.getRevision())
Pyry Haulos1abab602014-11-05 17:41:42 -0800153
154def writeInlFile (filename, source):
Pyry Haulosa0178632014-11-21 14:56:21 -0800155 khr_util.format.writeInlFile(filename, INL_HEADER, source)
Pyry Haulos1abab602014-11-05 17:41:42 -0800156
Pyry Haulosa0178632014-11-21 14:56:21 -0800157# Aliases from khr_util.common
Pyry Haulos3c67e4f2014-12-19 15:45:39 -0800158indentLines = khr_util.format.indentLines
159normalizeConstant = khr_util.format.normalizeConstant
160commandParams = khr_util.format.commandParams
161commandArgs = khr_util.format.commandArgs