1# Copyright 2018 Google LLC 2# SPDX-License-Identifier: MIT 3 4from .common.codegen import CodeGen, VulkanAPIWrapper 5from .common.vulkantypes import \ 6 VulkanAPI, makeVulkanTypeSimple, iterateVulkanType 7 8from .wrapperdefs import VulkanWrapperGenerator 9 10from .wrapperdefs import API_PREFIX_VALIDATE 11from .wrapperdefs import PARAMETERS_VALIDATE 12from .wrapperdefs import VOID_TYPE 13from .wrapperdefs import VALIDATE_RESULT_TYPE 14from .wrapperdefs import VALIDATE_VAR_NAME 15from .wrapperdefs import VALIDATE_GOOD_RESULT 16 17from .wrapperdefs import VULKAN_STREAM_TYPE 18from .wrapperdefs import VULKAN_STREAM_VAR_NAME 19 20from .wrapperdefs import API_PREFIX_MARSHAL 21from .wrapperdefs import API_PREFIX_FRONTEND 22 23# Frontend 24class VulkanFrontend(VulkanWrapperGenerator): 25 26 def __init__(self, module, typeInfo): 27 VulkanWrapperGenerator.__init__(self, module, typeInfo) 28 29 def validateDefFunc(_codegen, _api): 30 # TODO 31 pass 32 33 self.validateWrapper = \ 34 VulkanAPIWrapper( 35 API_PREFIX_VALIDATE, 36 PARAMETERS_VALIDATE, 37 VOID_TYPE, 38 validateDefFunc) 39 40 def frontendDefFunc(codegen, api): 41 retTypeName = api.retType.typeName 42 43 codegen.stmt( 44 "%s %s = %s" % (VALIDATE_RESULT_TYPE, VALIDATE_VAR_NAME, 45 VALIDATE_GOOD_RESULT)) 46 codegen.funcCall(None, API_PREFIX_VALIDATE + api.origName, 47 ["&%s" % VALIDATE_VAR_NAME] + list( 48 map(lambda p: p.paramName, api.parameters))) 49 50 codegen.beginIf( 51 "%s != %s" % (VALIDATE_VAR_NAME, VALIDATE_GOOD_RESULT)) 52 if retTypeName == VALIDATE_RESULT_TYPE: 53 codegen.stmt("return %s" % VALIDATE_VAR_NAME) 54 elif retTypeName != "void": 55 codegen.stmt("return (%s)0" % retTypeName) 56 else: 57 codegen.stmt("return") 58 codegen.endIf() 59 60 codegen.stmt("// VULKAN_STREAM_GET()") 61 codegen.stmt("%s* %s = nullptr" % (VULKAN_STREAM_TYPE, 62 VULKAN_STREAM_VAR_NAME)) 63 64 retLhs = None 65 if retTypeName != "void": 66 retLhs = retTypeName + " res" 67 68 codegen.funcCall(retLhs, API_PREFIX_MARSHAL + api.origName, 69 [VULKAN_STREAM_VAR_NAME] + list( 70 map(lambda p: p.paramName, api.parameters))) 71 72 if retTypeName != "void": 73 codegen.stmt("return res") 74 75 self.frontendWrapper = \ 76 VulkanAPIWrapper( 77 API_PREFIX_FRONTEND, 78 [], 79 None, 80 frontendDefFunc) 81 82 def onGenCmd(self, cmdinfo, name, alias): 83 VulkanWrapperGenerator.onGenCmd(self, cmdinfo, name, alias) 84 self.module.appendHeader( 85 self.frontendWrapper.makeDecl(self.typeInfo, name)) 86 self.module.appendImpl( 87 self.validateWrapper.makeDefinition( 88 self.typeInfo, name, isStatic=True)) 89 self.module.appendImpl( 90 self.frontendWrapper.makeDefinition(self.typeInfo, name)) 91