| # 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 |
| from .common.vulkantypes import \ |
| VulkanCompoundType, VulkanAPI, makeVulkanTypeSimple, vulkanTypeNeedsTransform, vulkanTypeGetNeededTransformTypes, VulkanTypeIterator, iterateVulkanType, vulkanTypeforEachSubType, TRANSFORMED_TYPES |
| |
| from .wrapperdefs import VulkanWrapperGenerator |
| from .wrapperdefs import STRUCT_EXTENSION_PARAM, STRUCT_EXTENSION_PARAM_FOR_WRITE |
| |
| # This is different from others; it operations solely in terms of deepcopy and handlemap |
| class VulkanUnbox(VulkanWrapperGenerator): |
| def __init__(self, module, typeInfo): |
| VulkanWrapperGenerator.__init__(self, module, typeInfo) |
| |
| self.codegen = CodeGen() |
| |
| self.unboxPrefix = "unbox" |
| self.toUnboxVar = "toUnbox" |
| self.poolParam = \ |
| makeVulkanTypeSimple(False, "BumpPool", 1, "pool") |
| |
| self.knownStructs = {} |
| self.needsTransform = set([]) |
| |
| def onBegin(self,): |
| VulkanWrapperGenerator.onBegin(self) |
| |
| def onGenType(self, typeXml, name, alias): |
| VulkanWrapperGenerator.onGenType(self, typeXml, name, alias) |
| |
| if name in self.knownStructs: |
| return |
| |
| category = self.typeInfo.categoryOf(name) |
| |
| if category in ["struct", "union"] and alias: |
| self.module.appendHeader( |
| self.codegen.makeFuncAlias(self.unboxPrefix + "_" + name, |
| self.unboxPrefix + "_" + alias)) |
| |
| if category in ["struct", "union"] and not alias: |
| structInfo = self.typeInfo.structs[name] |
| self.knownStructs[name] = structInfo |
| |
| api = VulkanAPI( \ |
| self.unboxPrefix + "_" + name, |
| makeVulkanTypeSimple(False, name, 1), |
| [self.poolParam] + \ |
| [makeVulkanTypeSimple( \ |
| True, name, 1, self.toUnboxVar)]) |
| |
| def funcDefGenerator(cgen): |
| cgen.stmt("BoxedHandleUnwrapMapping unboxMapping") |
| cgen.stmt("%s* res = (%s*)pool->alloc(sizeof(const %s))" % (name, name, name)) |
| cgen.stmt("deepcopy_%s(pool, %s, %s)" % (name, self.toUnboxVar, "res")) |
| cgen.stmt("handlemap_%s(%s, %s)" % (name, "&unboxMapping", "res")) |
| cgen.stmt("return res") |
| |
| self.module.appendHeader( |
| self.codegen.makeFuncDecl(api)) |
| self.module.appendImpl( |
| self.codegen.makeFuncImpl(api, funcDefGenerator)) |
| |
| def onGenCmd(self, cmdinfo, name, alias): |
| VulkanWrapperGenerator.onGenCmd(self, cmdinfo, name, alias) |
| |
| def onEnd(self,): |
| VulkanWrapperGenerator.onEnd(self) |