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 <aruby@blackberry.com>
Acked-by: Yonggang Luo <luoyonggang@gmail.com>
Acked-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27246>
This commit is contained in:
Lars Harrison
2023-12-20 22:59:00 +00:00
committed by Marge Bot
parent a45560cd5a
commit 3104712e99
2 changed files with 17 additions and 3 deletions
@@ -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)))
@@ -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")