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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user