fix validation headers and potential amd issues

This commit is contained in:
PancakeTAS 2025-07-10 16:11:46 +02:00
parent 794fbcf28c
commit 0d125a115d
No known key found for this signature in database
4 changed files with 37 additions and 2 deletions

View file

@ -25,6 +25,11 @@ namespace Layer {
VkDevice device,
const VkAllocationCallbacks* pAllocator);
/// Call to the original vkSetDeviceLoaderData function.
VkResult ovkSetDeviceLoaderData(
VkDevice device,
void* object);
/// Call to the original vkGetInstanceProcAddr function.
PFN_vkVoidFunction ovkGetInstanceProcAddr(
VkInstance instance,

View file

@ -16,6 +16,8 @@ namespace {
PFN_vkCreateDevice next_vkCreateDevice{};
PFN_vkDestroyDevice next_vkDestroyDevice{};
PFN_vkSetDeviceLoaderData next_vSetDeviceLoaderData{};
PFN_vkGetInstanceProcAddr next_vkGetInstanceProcAddr{};
PFN_vkGetDeviceProcAddr next_vkGetDeviceProcAddr{};
@ -152,11 +154,28 @@ namespace {
return VK_ERROR_INITIALIZATION_FAILED;
}
// advance link info (i don't really know what this does)
next_vkGetDeviceProcAddr = layerDesc->u.pLayerInfo->pfnNextGetDeviceProcAddr;
next_vkGetDeviceProcAddr = layerDesc->u.pLayerInfo->pfnNextGetDeviceProcAddr;;
Log::debug("layer", "Next device proc addr: {:x}",
reinterpret_cast<uintptr_t>(next_vkGetDeviceProcAddr));
// find second layer creation info
auto* layerDesc2 = const_cast<VkLayerDeviceCreateInfo*>(
reinterpret_cast<const VkLayerDeviceCreateInfo*>(pCreateInfo->pNext));
while (layerDesc2 && (layerDesc2->sType != VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
|| layerDesc2->function != VK_LOADER_DATA_CALLBACK)) {
layerDesc2 = const_cast<VkLayerDeviceCreateInfo*>(
reinterpret_cast<const VkLayerDeviceCreateInfo*>(layerDesc2->pNext));
}
if (!layerDesc2) {
Log::error("layer", "No layer creation info found in pNext chain");
return VK_ERROR_INITIALIZATION_FAILED;
}
next_vSetDeviceLoaderData = layerDesc2->u.pfnSetDeviceLoaderData;
Log::debug("layer", "Next device loader data: {:x}",
reinterpret_cast<uintptr_t>(next_vSetDeviceLoaderData));
// advance link info (i don't really know what this does)
layerDesc->u.pLayerInfo = layerDesc->u.pLayerInfo->pNext;
// create device
@ -317,6 +336,12 @@ void Layer::ovkDestroyDevice(
reinterpret_cast<uintptr_t>(device));
}
VkResult Layer::ovkSetDeviceLoaderData(VkDevice device, void* object) {
Log::debug("vulkan", "vkSetDeviceLoaderData called for object {:x}",
reinterpret_cast<uintptr_t>(object));
return next_vSetDeviceLoaderData(device, object);
}
PFN_vkVoidFunction Layer::ovkGetInstanceProcAddr(
VkInstance instance,
const char* pName) {

View file

@ -17,6 +17,7 @@ CommandBuffer::CommandBuffer(VkDevice device, const CommandPool& pool) {
auto res = Layer::ovkAllocateCommandBuffers(device, &desc, &commandBufferHandle);
if (res != VK_SUCCESS || commandBufferHandle == VK_NULL_HANDLE)
throw LSFG::vulkan_error(res, "Unable to allocate command buffer");
res = Layer::ovkSetDeviceLoaderData(device, commandBufferHandle);
// store command buffer in shared ptr
this->state = std::make_shared<CommandBufferState>(CommandBufferState::Empty);

View file

@ -36,6 +36,10 @@ std::pair<uint32_t, VkQueue> Utils::findQueue(VkDevice device, VkPhysicalDevice
VkQueue queue{};
Layer::ovkGetDeviceQueue(device, *idx, 0, &queue);
auto res = Layer::ovkSetDeviceLoaderData(device, queue);
if (res != VK_SUCCESS)
throw LSFG::vulkan_error(res, "Unable to set device loader data for queue");
return { *idx, queue };
}