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")