summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYilong Li <liyl@google.com>2021-02-19 01:24:09 -0800
committerYilong Li <liyl@google.com>2021-02-19 01:35:14 -0800
commitc36d011e265f44dc32cd5c5003acfa7037beb6b2 (patch)
tree0a6fc436d66a145c64bbf14690b8091e051315f8
parent91a340176a600f0303519b5e0d835915a83d083b (diff)
downloadgfxstream-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.py14
-rw-r--r--registry/vulkan/xml/cerealgenerator.py7
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)