From 3104712e99aa0e0488783f78c81575bbb697f122 Mon Sep 17 00:00:00 2001 From: Lars Harrison Date: Wed, 20 Dec 2023 22:59:00 +0000 Subject: [PATCH] Provide error message on unhandled VK structs This change provides more explicit error messages and a proper abort in situations where an unhandled VK structure is attempting to be used, based purely on calls to the size functions. This should enable better capture and debugging of these failures in the future (rather than hitting a segfault and having to diagnose). Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- .../codegen/scripts/cereal/extensionstructs.py | 15 ++++++++++++++- src/gfxstream/codegen/scripts/cerealgenerator.py | 5 +++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/gfxstream/codegen/scripts/cereal/extensionstructs.py b/src/gfxstream/codegen/scripts/cereal/extensionstructs.py index 3c24d059757..f6e30a962b3 100644 --- a/src/gfxstream/codegen/scripts/cereal/extensionstructs.py +++ b/src/gfxstream/codegen/scripts/cereal/extensionstructs.py @@ -26,11 +26,13 @@ from .wrapperdefs import STRUCT_TYPE_API_NAME class VulkanExtensionStructs(VulkanWrapperGenerator): - def __init__(self, module, typeInfo): + def __init__(self, module, typeInfo, variant="host"): VulkanWrapperGenerator.__init__(self, module, typeInfo) self.codegen = CodeGen() + self.variant = variant + self.structTypeRetType = \ makeVulkanTypeSimple(False, "uint32_t", 0) @@ -103,6 +105,15 @@ class VulkanExtensionStructs(VulkanWrapperGenerator): cgen.stmt("return 0") cgen.endIf() + def defaultAbortEmit(cgen): + # The 'structType' name and return behavior are defined in + # emitForEachStructExtension and not accessible here. Consequently, + # this is a copy-paste from there and must be updated accordingly. + # NOTE: No need for %% if no substitution is made. + cgen.stmt("fprintf(stderr, \"Unhandled Vulkan structure type %d, aborting.\\n\", structType)") + cgen.stmt("GFXSTREAM_ABORT(::emugl::FatalError(::emugl::ABORT_REASON_OTHER))") + cgen.stmt("return (%s)0" % self.extensionStructSizeRetType.typeName) + self.module.appendImpl( self.codegen.makeFuncImpl( self.extensionStructSizePrototype, @@ -111,6 +122,7 @@ class VulkanExtensionStructs(VulkanWrapperGenerator): self.extensionStructSizeRetType, STRUCT_EXTENSION_PARAM, forEachExtensionReturnSize, autoBreak=False, + defaultEmit=(defaultAbortEmit if self.variant == "host" else None), rootTypeVar=self.rootTypeParam))) self.module.appendImpl( @@ -121,4 +133,5 @@ class VulkanExtensionStructs(VulkanWrapperGenerator): self.extensionStructSizeRetType, STRUCT_EXTENSION_PARAM, forEachExtensionReturnSizeProtectedByFeature, autoBreak=False, + defaultEmit=(defaultAbortEmit if self.variant == "host" else None), rootTypeVar=self.rootTypeParam))) diff --git a/src/gfxstream/codegen/scripts/cerealgenerator.py b/src/gfxstream/codegen/scripts/cerealgenerator.py index 5062b69f1da..6a8de364801 100644 --- a/src/gfxstream/codegen/scripts/cerealgenerator.py +++ b/src/gfxstream/codegen/scripts/cerealgenerator.py @@ -454,6 +454,7 @@ using DlSymFunc = void* (void*, const char*); extensionStructsInclude = f""" {self.hostCommonExtraVulkanHeaders} #include "goldfish_vk_private_defs.h" +#include "host-common/GfxstreamFatalError.h" """ extensionStructsIncludeGuest = """ @@ -651,7 +652,7 @@ class BumpPool; extraHeader=createVkExtensionStructureTypePreamble('VK_ANDROID_NATIVE_BUFFER')) self.addWrapper(cereal.VulkanEncoder, "VkEncoder") - self.addWrapper(cereal.VulkanExtensionStructs, "goldfish_vk_extension_structs_guest") + self.addWrapper(cereal.VulkanExtensionStructs, "goldfish_vk_extension_structs_guest", variant = "guest") self.addWrapper(cereal.VulkanMarshaling, "goldfish_vk_marshaling_guest", variant = "guest") self.addWrapper(cereal.VulkanReservedMarshaling, "goldfish_vk_reserved_marshaling_guest", variant = "guest") self.addWrapper(cereal.VulkanDeepcopy, "goldfish_vk_deepcopy_guest") @@ -659,7 +660,7 @@ class BumpPool; self.addWrapper(cereal.VulkanTransform, "goldfish_vk_transform_guest") self.addWrapper(cereal.VulkanFuncTable, "func_table") - self.addWrapper(cereal.VulkanExtensionStructs, "goldfish_vk_extension_structs") + self.addWrapper(cereal.VulkanExtensionStructs, "goldfish_vk_extension_structs", variant = "host") self.addWrapper(cereal.VulkanMarshaling, "goldfish_vk_marshaling") self.addWrapper(cereal.VulkanReservedMarshaling, "goldfish_vk_reserved_marshaling", variant = "host") self.addWrapper(cereal.VulkanDeepcopy, "goldfish_vk_deepcopy")