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 os 24import re 25import sys 26 27sys.path.append(os.path.dirname(os.path.dirname(__file__))) 28 29import khr_util.format 30import khr_util.registry 31import khr_util.registry_cache 32 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")) 36OPENGL_INC_DIR = os.path.join(OPENGL_DIR, "wrapper") 37 38GL_SOURCE = khr_util.registry_cache.RegistrySource( 39 "gl.xml", 40 30159, 41 "0af7e185d0db15e9f44a1b6ff6c72102f67509a8590f19a289b983d652008070") 42 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', 51 'GL_EXT_texture_buffer', 52 'GL_EXT_texture_snorm', 53 'GL_EXT_primitive_bounding_box', 54 'GL_OES_EGL_image', 55 'GL_OES_compressed_ETC1_RGB8_texture', 56 'GL_OES_texture_half_float', 57 'GL_OES_texture_storage_multisample_2d_array', 58 'GL_OES_sample_shading', 59 'GL_EXT_texture_compression_s3tc', 60 'GL_IMG_texture_compression_pvrtc', 61 'GL_EXT_copy_image', 62 'GL_EXT_draw_buffers_indexed', 63 'GL_EXT_texture_sRGB_decode', 64 'GL_EXT_texture_border_clamp', 65 'GL_EXT_texture_sRGB_R8', 66 'GL_EXT_texture_sRGB_RG8', 67 'GL_EXT_debug_marker', 68] 69 70def getGLRegistry (): 71 return khr_util.registry_cache.getRegistry(GL_SOURCE) 72 73# return the name of a core command corresponding to an extension command. 74# Ideally this should be done using the alias attribute of commands, but dEQP 75# just strips the extension suffix. 76def getCoreName (name): 77 return re.sub('[A-Z]+$', '', name) 78 79def getHybridInterface (): 80 # This is a bit awkward, since we have to create a strange hybrid 81 # interface that includes both GL and ES features and extensions. 82 registry = getGLRegistry() 83 glFeatures = registry.getFeatures('gl') 84 esFeatures = registry.getFeatures('gles2') 85 spec = khr_util.registry.InterfaceSpec() 86 87 for feature in registry.getFeatures('gl'): 88 spec.addFeature(feature, 'gl', 'core') 89 90 for feature in registry.getFeatures('gles2'): 91 spec.addFeature(feature, 'gles2') 92 93 for extName in EXTENSIONS: 94 extension = registry.extensions[extName] 95 # Add all extensions using the ES2 api, but force even non-ES2 96 # extensions to be included. 97 spec.addExtension(extension, 'gles2', 'core', force=True) 98 99 # Remove redundant extension commands that are already provided by core. 100 for commandName in list(spec.commands): 101 coreName = getCoreName(commandName) 102 if coreName != commandName and coreName in spec.commands: 103 spec.commands.remove(commandName) 104 105 return khr_util.registry.createInterface(registry, spec, 'gles2') 106 107def getInterface (registry, api, version=None, profile=None, **kwargs): 108 spec = khr_util.registry.spec(registry, api, version, profile, **kwargs) 109 if api == 'gl' and profile == 'core' and version < "3.2": 110 gl32 = registry.features['GL_VERSION_3_2'] 111 for eRemove in gl32.xpath('remove'): 112 spec.addComponent(eRemove) 113 return khr_util.registry.createInterface(registry, spec, api) 114 115def getVersionToken (api, version): 116 prefixes = { 'gles2': "ES", 'gl': "GL" } 117 return prefixes[api] + version.replace(".", "") 118 119def genCommandList(iface, renderCommand, directory, filename, align=False): 120 lines = map(renderCommand, iface.commands) 121 if align: 122 lines = indentLines(lines) 123 writeInlFile(os.path.join(directory, filename), lines) 124 125def genCommandLists(registry, renderCommand, check, directory, filePattern, align=False): 126 for eFeature in registry.features: 127 api = eFeature.get('api') 128 version = eFeature.get('number') 129 profile = check(api, version) 130 if profile is True: 131 profile = None 132 elif profile is False: 133 continue 134 iface = getInterface(registry, api, version=version, profile=profile) 135 filename = filePattern % getVersionToken(api, version) 136 genCommandList(iface, renderCommand, directory, filename, align) 137 138def getFunctionTypeName (funcName): 139 return "%sFunc" % funcName 140 141def getFunctionMemberName (funcName): 142 assert funcName[:2] == "gl" 143 if funcName[:5] == "glEGL": 144 # Otherwise we end up with gl.eGLImage... 145 return "egl%s" % funcName[5:] 146 else: 147 return "%c%s" % (funcName[2].lower(), funcName[3:]) 148 149INL_HEADER = khr_util.format.genInlHeader("Khronos GL API description (gl.xml)", GL_SOURCE.getRevision()) 150 151def writeInlFile (filename, source): 152 khr_util.format.writeInlFile(filename, INL_HEADER, source) 153 154# Aliases from khr_util.common 155indentLines = khr_util.format.indentLines 156normalizeConstant = khr_util.format.normalizeConstant 157commandParams = khr_util.format.commandParams 158commandArgs = khr_util.format.commandArgs 159