11abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos# -*- coding: utf-8 -*-
21abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
33c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#-------------------------------------------------------------------------
43c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# drawElements Quality Program utilities
53c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# --------------------------------------
63c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
73c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Copyright 2015 The Android Open Source Project
83c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
93c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Licensed under the Apache License, Version 2.0 (the "License");
103c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# you may not use this file except in compliance with the License.
113c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# You may obtain a copy of the License at
123c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
133c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#      http://www.apache.org/licenses/LICENSE-2.0
143c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
153c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# Unless required by applicable law or agreed to in writing, software
163c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# distributed under the License is distributed on an "AS IS" BASIS,
173c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
183c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# See the License for the specific language governing permissions and
193c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry# limitations under the License.
203c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#
213c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry#-------------------------------------------------------------------------
223c77ed4e119083afaec64a173bfdcf024c271635Jarkko Pöyry
231abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosimport os
241abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosfrom src_util import *
251abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosfrom itertools import imap, chain
261abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
271abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosdef getMangledName (funcName):
281abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	assert funcName[:2] == "gl"
291abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	return "glw" + funcName[2:]
301abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
311abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosdef commandAliasDefinition (command):
321abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	return "#define\t%s\t%s" % (command.name, getMangledName(command.name))
331abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
341abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosdef commandWrapperDeclaration (command):
351abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	return "%s\t%s\t(%s);" % (
361abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		command.type,
371abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		getMangledName(command.name),
381abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		", ".join([param.declaration for param in command.params]))
391abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
401abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosdef genWrapperHeader (iface):
411abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	defines = imap(commandAliasDefinition, iface.commands)
421abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	prototypes = imap(commandWrapperDeclaration, iface.commands)
431abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	src = indentLines(chain(defines, prototypes))
441abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	writeInlFile(os.path.join(OPENGL_INC_DIR, "glwApi.inl"), src)
451abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
461abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosdef getDefaultReturn (command):
471abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	if command.name == "glGetError":
481abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		return "GL_INVALID_OPERATION"
491abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	else:
501abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		assert command.type != 'void'
511abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		return "(%s)0" % command.type
521abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
531abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosdef commandWrapperDefinition (command):
541abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	template = """
551abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos{returnType} {mangledName} ({paramDecls})
561abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos{{
571abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	const glw::Functions* gl = glw::getCurrentThreadFunctions();
581abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	if (!gl)
591abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		return{defaultReturn};
601abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	{maybeReturn}gl->{memberName}({arguments});
611abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos}}"""
621abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	return template.format(
631abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		returnType		= command.type,
641abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		mangledName		= getMangledName(command.name),
651abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		paramDecls		= commandParams(command),
661abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		defaultReturn	= " " + getDefaultReturn(command) if command.type != 'void' else "",
671abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		maybeReturn		= "return " if command.type != 'void' else "",
681abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		memberName		= getFunctionMemberName(command.name),
691abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos		arguments		= commandArgs(command))
701abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
711abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosdef genWrapperImplementation (iface):
721abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	genCommandList(iface, commandWrapperDefinition, OPENGL_INC_DIR, "glwImpl.inl")
731abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
741abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosdef genWrapper (iface):
751abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	genWrapperHeader(iface)
761abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	genWrapperImplementation(iface)
771abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos
781abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulosif __name__ == "__main__":
791abab607ca1c1b410881390f9ec47e6be04c207dPyry Haulos	genWrapper(getHybridInterface())
80