# Copyright (c) 2018 The Android Open Source Project # Copyright (c) 2018 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from .common.codegen import CodeGen, VulkanAPIWrapper from .common.vulkantypes import \ VulkanAPI, makeVulkanTypeSimple, iterateVulkanType from .wrapperdefs import VulkanWrapperGenerator from .wrapperdefs import API_PREFIX_VALIDATE from .wrapperdefs import PARAMETERS_VALIDATE from .wrapperdefs import VOID_TYPE from .wrapperdefs import VALIDATE_RESULT_TYPE from .wrapperdefs import VALIDATE_VAR_NAME from .wrapperdefs import VALIDATE_GOOD_RESULT from .wrapperdefs import VULKAN_STREAM_TYPE from .wrapperdefs import VULKAN_STREAM_VAR_NAME from .wrapperdefs import API_PREFIX_MARSHAL from .wrapperdefs import API_PREFIX_FRONTEND # Frontend class VulkanFrontend(VulkanWrapperGenerator): def __init__(self, module, typeInfo): VulkanWrapperGenerator.__init__(self, module, typeInfo) def validateDefFunc(_codegen, _api): # TODO pass self.validateWrapper = \ VulkanAPIWrapper( API_PREFIX_VALIDATE, PARAMETERS_VALIDATE, VOID_TYPE, validateDefFunc) def frontendDefFunc(codegen, api): retTypeName = api.retType.typeName codegen.stmt( "%s %s = %s" % (VALIDATE_RESULT_TYPE, VALIDATE_VAR_NAME, VALIDATE_GOOD_RESULT)) codegen.funcCall(None, API_PREFIX_VALIDATE + api.origName, ["&%s" % VALIDATE_VAR_NAME] + list( map(lambda p: p.paramName, api.parameters))) codegen.beginIf( "%s != %s" % (VALIDATE_VAR_NAME, VALIDATE_GOOD_RESULT)) if retTypeName == VALIDATE_RESULT_TYPE: codegen.stmt("return %s" % VALIDATE_VAR_NAME) elif retTypeName != "void": codegen.stmt("return (%s)0" % retTypeName) else: codegen.stmt("return") codegen.endIf() codegen.stmt("// VULKAN_STREAM_GET()") codegen.stmt("%s* %s = nullptr" % (VULKAN_STREAM_TYPE, VULKAN_STREAM_VAR_NAME)) retLhs = None if retTypeName != "void": retLhs = retTypeName + " res" codegen.funcCall(retLhs, API_PREFIX_MARSHAL + api.origName, [VULKAN_STREAM_VAR_NAME] + list( map(lambda p: p.paramName, api.parameters))) if retTypeName != "void": codegen.stmt("return res") self.frontendWrapper = \ VulkanAPIWrapper( API_PREFIX_FRONTEND, [], None, frontendDefFunc) def onGenCmd(self, cmdinfo, name, alias): VulkanWrapperGenerator.onGenCmd(self, cmdinfo, name, alias) self.module.appendHeader( self.frontendWrapper.makeDecl(self.typeInfo, name)) self.module.appendImpl( self.validateWrapper.makeDefinition( self.typeInfo, name, isStatic=True)) self.module.appendImpl( self.frontendWrapper.makeDefinition(self.typeInfo, name))