diff options
author | Yilong Li <liyl@google.com> | 2021-02-19 01:24:09 -0800 |
---|---|---|
committer | Yilong Li <liyl@google.com> | 2021-02-19 01:35:14 -0800 |
commit | c36d011e265f44dc32cd5c5003acfa7037beb6b2 (patch) | |
tree | 0a6fc436d66a145c64bbf14690b8091e051315f8 | |
parent | 91a340176a600f0303519b5e0d835915a83d083b (diff) | |
download | gfxstream-protocols-c36d011e265f44dc32cd5c5003acfa7037beb6b2.tar.gz |
cereal: (host) Ignore unknown structs in deepcopy
Guest Vulkan loaders may add a struct with an internal
struct type (VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO)
when creating devices. Since this is not a standard Vulkan
struct, Vulkan encoder cannot get the struct size, thus
it cannot allocate memory and stops deep-copying all the
chaining structs.
This caused a failure when client calls vkCreateDevice
with chaining structs like VkPhysicalDeviceTimelineSemaphoreFeatures,
where vulkan loader may add an internal struct in between.
This change modifies the deepcopy guest/host code so that
if they encounter an unknown struct, it will skip it
instead of interrupting the copy process.
Change-Id: I7ce09e209393319b86d45836a77b270054997b69
-rw-r--r-- | registry/vulkan/xml/cereal/deepcopy.py | 14 | ||||
-rw-r--r-- | registry/vulkan/xml/cerealgenerator.py | 7 |
2 files changed, 17 insertions, 4 deletions
diff --git a/registry/vulkan/xml/cereal/deepcopy.py b/registry/vulkan/xml/cereal/deepcopy.py index 70955277..cd7babe8 100644 --- a/registry/vulkan/xml/cereal/deepcopy.py +++ b/registry/vulkan/xml/cereal/deepcopy.py @@ -193,8 +193,18 @@ class DeepcopyCodegen(VulkanTypeIterator): rhsExpr = "(%s)(%s)" % ("void*", rhs) + nextVar = "from_%s" % vulkanType.paramName sizeVar = "%s_size" % vulkanType.paramName - self.cgen.stmt("size_t %s = %s(%s)" % (sizeVar, EXTENSION_SIZE_API_NAME, lhs)) + + self.cgen.stmt("const void* %s = %s" % (nextVar, self.inputVars[0])) + self.cgen.stmt("size_t %s = 0u" % sizeVar) + self.cgen.beginWhile("!%s && %s" % (sizeVar, nextVar)) + self.cgen.stmt("%s = static_cast<const vk_struct_common*>(%s)->%s" % ( + nextVar, nextVar, vulkanType.paramName + )) + self.cgen.stmt("%s = %s(%s)" % (sizeVar, EXTENSION_SIZE_API_NAME, nextVar)) + self.cgen.endWhile() + self.cgen.stmt("%s = nullptr" % rhs) self.cgen.beginIf(sizeVar) @@ -205,7 +215,7 @@ class DeepcopyCodegen(VulkanTypeIterator): self.poolVarName, sizeVar)) self.cgen.funcCall(None, self.prefix + "extension_struct", - [self.poolVarName, lhs, rhsExpr]) + [self.poolVarName, nextVar, rhsExpr]) self.cgen.endIf() diff --git a/registry/vulkan/xml/cerealgenerator.py b/registry/vulkan/xml/cerealgenerator.py index a98bf7dc..12dc6ec4 100644 --- a/registry/vulkan/xml/cerealgenerator.py +++ b/registry/vulkan/xml/cerealgenerator.py @@ -249,6 +249,9 @@ using android::base::BumpPool; transformImplInclude = """ #include "VkDecoderGlobalState.h" """ + deepcopyInclude = """ +#include "vk_util.h" +""" poolIncludeGuest = """ #include "goldfish_vk_private_defs.h" #include "android/base/BumpPool.h" @@ -405,7 +408,7 @@ class BumpPool; extraImpl=commonCerealImplIncludesGuest + reservedmarshalImplIncludeGuest) self.addGuestEncoderModule("goldfish_vk_deepcopy_guest", extraHeader=commonCerealIncludesGuest + poolIncludeGuest, - extraImpl=commonCerealImplIncludesGuest) + extraImpl=commonCerealImplIncludesGuest + deepcopyInclude) self.addGuestEncoderModule("goldfish_vk_counting_guest", extraHeader=countingIncludes, extraImpl=commonCerealImplIncludesGuest) @@ -431,7 +434,7 @@ class BumpPool; extraImpl=commonCerealImplIncludes) self.addModule("common", "goldfish_vk_deepcopy", extraHeader=poolInclude, - extraImpl=commonCerealImplIncludes) + extraImpl=commonCerealImplIncludes + deepcopyInclude) self.addModule("common", "goldfish_vk_handlemap", extraHeader=handleMapInclude, extraImpl=commonCerealImplIncludes) |