Я создаю приложение с помощью Vulkan и столкнулся с проблемой.
На моем ноутбуке (только встроенная графика) vkcube.exe работает нормально. Таким образом, проблем с поддержкой расширений нет. Но когда я сам создаю приложение, оно говорит, что расширение VK_KHR_swapchain отсутствует.
Также есть проверка безопасности, при которой я вызываю vkEnumerateDeviceExtensionProperties
, и в списке присутствует VK_KHR_swapchain, поэтому его необходимо поддерживать.
Вот расширения устройств, поддерживаемые моим встроенным графическим процессором:
[09:19:24:716] [TRACE]: Device Extension: VK_EXT_device_address_binding_report
[09:19:24:716] [TRACE]: Device Extension: VK_EXT_full_screen_exclusive
[09:19:24:717] [TRACE]: Device Extension: VK_KHR_swapchain
VkDeviceCreateInfo device_create_info = {VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO};
device_create_info.queueCreateInfoCount = index_count;
device_create_info.pQueueCreateInfos = queue_create_info;
device_create_info.pEnabledFeatures = &device_features;
device_create_info.enabledExtensionCount = 1;
const char* extension_names[1] = {VK_KHR_SWAPCHAIN_EXTENSION_NAME};
device_create_info.ppEnabledExtensionNames = (const char* const*)&extension_names;
device_create_info.enabledLayerCount = 0;
device_create_info.ppEnabledLayerNames = 0;
GRD_LOG_DEBUG("Creating logical device for physical device: %s", context->device.properties.deviceName);
VkResult result = vkCreateDevice(
context->device.physical_device,
&device_create_info,
context->allocator,
&context->device.logical_device);
if (result != VK_SUCCESS)
{
GRD_LOG_FATAL("Could not create vulkan logical device. Result: %d", result);
return FALSE;
}
Это результат:
[08:58:45:587] [DEBUG]: Creating logical device for physical device: Intel(R) Iris(R) Xe Graphics
[08:58:45:587] [ERROR]: loader_validate_device_extensions: Device extension VK_KHR_swapchain not supported by selected physical device or enabled layers.
[08:58:45:589] [ERROR]: vkCreateDevice: Failed to validate extensions in list
[08:58:45:589] [FATAL]: Could not create vulkan logical device. Result: -7 // Result Code for Extension not present
Это включенные расширения экземпляра.
[08:58:45:482] [DEBUG]: Vulkan Required extensions:
[08:58:45:482] [DEBUG]: 1: VK_KHR_surface
[08:58:45:483] [DEBUG]: 2: VK_KHR_get_physical_device_properties2
[08:58:45:483] [DEBUG]: 3: VK_KHR_portability_enumeration
[08:58:45:483] [DEBUG]: 4: VK_KHR_win32_surface
[08:58:45:483] [DEBUG]: 5: VK_EXT_debug_utils
Хорошо, ребята, с Вулканом все в порядке, не то чтобы я ожидал, что с Вулканом что-то не так.
Я использовал собственный распределитель. В обратном вызове перераспределения я выделял новую память, но не копировал старый блок памяти на новый адрес, что могло привести к некоторым повреждениям данных (на самом деле потеря данных, поскольку новые выделения были обнулены вместо того, чтобы содержать старые данные) и привело к этому ошибка.
Как только я добавил логику для копирования данных предыдущего блока памяти на новый адрес в обратном вызове перераспределения, программа заработала как положено.
Хотя реальные изменения кода сложны и содержат более 100 строк, вот обзор того, что было не так и как это было исправлено.
См. VkAllocationCallbacks - VkSpec для понимания определения функции и того, что означают/представляют параметры.
До:
void* VKAPI_PTR vulkan_memory_reallocate(
void* pUserData,
void* pOriginal,
size_t size,
size_t alignment,
VkSystemAllocationScope allocationScope)
{
if (pOriginal)
{
free_aligned_memory(pOriginal);
}
return allocate_aligned_memory(size, alignment);
}
После исправления:
void* VKAPI_PTR vulkan_memory_reallocate(
void* pUserData,
void* pOriginal,
size_t size,
size_t alignment,
VkSystemAllocationScope allocationScope)
{
void* new_ptr = allocate_aligned_memory(size, alignment);
// size of memory requested by vulkan during allocation of pOriginal.
// i.e. the amount of bytes we have to copy from the previous address to the new address.
uint64 block_size = 0;
get_block_size(pOriginal, &block_size);
grd_copy_memory(new_ptr, pOriginal, block_size);
if (pOriginal)
{
free_aligned_memory(pOriginal);
}
return new_ptr;
}
@AndrewHenle, эй, Эндрю. спасибо за ваше предложение. я сделал это.
Было бы полезно, если бы вы добавили внесенные вами изменения в код, чтобы ваша система заработала.