1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2015 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ciimport os
24e5c31af7Sopenharmony_cifrom egl.common import *
25e5c31af7Sopenharmony_cifrom egl.enums import enumValue
26e5c31af7Sopenharmony_cifrom egl.library import getExtOnlyIface
27e5c31af7Sopenharmony_cifrom khr_util.format import indentLines
28e5c31af7Sopenharmony_cifrom itertools import chain
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_citry:
31e5c31af7Sopenharmony_ci	from itertools import imap
32e5c31af7Sopenharmony_ciexcept ImportError:
33e5c31af7Sopenharmony_ci	imap=map
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_cidef getMangledName (funcName):
36e5c31af7Sopenharmony_ci	assert funcName[:3] == "egl"
37e5c31af7Sopenharmony_ci	return "eglw" + funcName[3:]
38e5c31af7Sopenharmony_ci
39e5c31af7Sopenharmony_cidef commandAliasDefinition (command):
40e5c31af7Sopenharmony_ci	return "#define\t%s\t%s" % (command.name, getMangledName(command.name))
41e5c31af7Sopenharmony_ci
42e5c31af7Sopenharmony_cidef commandWrapperDeclaration (command):
43e5c31af7Sopenharmony_ci	return "%s\t%s\t(%s);" % (
44e5c31af7Sopenharmony_ci		command.type,
45e5c31af7Sopenharmony_ci		getMangledName(command.name),
46e5c31af7Sopenharmony_ci		", ".join([param.declaration for param in command.params]))
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ciNATIVE_TYPES = [
49e5c31af7Sopenharmony_ci	"EGLNativeWindowType",
50e5c31af7Sopenharmony_ci	"EGLNativeDisplayType",
51e5c31af7Sopenharmony_ci	"EGLNativePixmapType",
52e5c31af7Sopenharmony_ci]
53e5c31af7Sopenharmony_ci
54e5c31af7Sopenharmony_cidef commandWrapperDefinition (command):
55e5c31af7Sopenharmony_ci	template = """
56e5c31af7Sopenharmony_ci{returnType} {mangledName} ({paramDecls})
57e5c31af7Sopenharmony_ci{{
58e5c31af7Sopenharmony_ci	const eglw::Library* egl = eglw::getCurrentThreadLibrary();
59e5c31af7Sopenharmony_ci	if (!egl)
60e5c31af7Sopenharmony_ci		return{defaultReturn};
61e5c31af7Sopenharmony_ci	{maybeReturn}egl->{memberName}({arguments});
62e5c31af7Sopenharmony_ci}}"""
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_ci	arguments = []
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_ci	for param in command.params:
67e5c31af7Sopenharmony_ci		if param.type in NATIVE_TYPES:
68e5c31af7Sopenharmony_ci			arguments.append("(void*)" + param.name)
69e5c31af7Sopenharmony_ci		else:
70e5c31af7Sopenharmony_ci			arguments.append(param.name)
71e5c31af7Sopenharmony_ci
72e5c31af7Sopenharmony_ci	return template.format(
73e5c31af7Sopenharmony_ci		returnType		= command.type,
74e5c31af7Sopenharmony_ci		mangledName		= "eglw" + command.name[3:],
75e5c31af7Sopenharmony_ci		paramDecls		= commandParams(command),
76e5c31af7Sopenharmony_ci		defaultReturn	= " " + getDefaultReturn(command) if command.type != 'void' else "",
77e5c31af7Sopenharmony_ci		maybeReturn		= "return " if command.type != 'void' else "",
78e5c31af7Sopenharmony_ci		memberName		= getFunctionMemberName(command.name),
79e5c31af7Sopenharmony_ci		arguments		= ", ".join(arguments))
80e5c31af7Sopenharmony_ci
81e5c31af7Sopenharmony_cidef getDefaultReturn (command):
82e5c31af7Sopenharmony_ci	if command.name == "glGetError":
83e5c31af7Sopenharmony_ci		return "GL_INVALID_OPERATION"
84e5c31af7Sopenharmony_ci	else:
85e5c31af7Sopenharmony_ci		assert command.type != 'void'
86e5c31af7Sopenharmony_ci		return "(%s)0" % command.type
87e5c31af7Sopenharmony_ci
88e5c31af7Sopenharmony_cicommandParams = khr_util.format.commandParams
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_cidef enumDefinitionC (enum):
91e5c31af7Sopenharmony_ci	return "#define %s\t%s" % (enum.name, enumValue(enum))
92e5c31af7Sopenharmony_ci
93e5c31af7Sopenharmony_cidef gen (registry):
94e5c31af7Sopenharmony_ci	noExtIface		= getInterface(registry, 'egl', VERSION)
95e5c31af7Sopenharmony_ci	extOnlyIface	= getExtOnlyIface(registry, 'egl', EXTENSIONS)
96e5c31af7Sopenharmony_ci	defaultIface	= getDefaultInterface()
97e5c31af7Sopenharmony_ci	defines			= imap(commandAliasDefinition, defaultIface.commands)
98e5c31af7Sopenharmony_ci	prototypes		= imap(commandWrapperDeclaration, defaultIface.commands)
99e5c31af7Sopenharmony_ci	src				= indentLines(chain(defines, prototypes))
100e5c31af7Sopenharmony_ci
101e5c31af7Sopenharmony_ci	writeInlFile(os.path.join(EGL_WRAPPER_DIR, "eglwApi.inl"), src)
102e5c31af7Sopenharmony_ci	writeInlFile(os.path.join(EGL_WRAPPER_DIR, "eglwEnumsC.inl"), indentLines(map(enumDefinitionC, defaultIface.enums)))
103e5c31af7Sopenharmony_ci	genCommandList(noExtIface, commandWrapperDefinition, EGL_WRAPPER_DIR, "eglwImpl.inl")
104e5c31af7Sopenharmony_ci	genCommandList(extOnlyIface, commandWrapperDefinition, EGL_WRAPPER_DIR, "eglwImplExt.inl")
105e5c31af7Sopenharmony_ci
106