Вы уверены, что звонок на vkCreateInstance()
вызывает сбой? Я не пытался отлаживать код, который вы показали (это ваша работа), но просто глядя на вызовы, которые делает код, это должен быть вызов vkEnumerateInstanceExtensionProperties()
, который дает сбой (если он вообще компилируется! ).
2-й параметр vkEnumerateInstanceExtensionProperties()
ожидает указатель uint32_t*
, но вы передаете значение uint32_t
(VulkanCreateInfo.enabledExtensionCount
), которое было инициализировано равным 0. Таким образом, это сделает Параметр pPropertyCount
будет указателем NULL (если он даже компилируется).
Вы передаете VulkanCreateInfo.ppEnabledExtensionNames
в 3-м параметре (если он даже компилируется), и ppEnabledExtensionNames
был инициализирован в NULL. Согласно документации для vkEnumerateInstanceExtensionProperties()
:
Если pProperties
равен NULL, то число доступных свойств расширений возвращается в pPropertyCount
. В противном случае pPropertyCount
должен указывать на переменную, установленную пользователем на количество элементов в массиве pProperties
, а при возврате переменная перезаписывается с количеством структур, фактически записанным в pProperties
.
Поскольку pPropertCount
имеет значение NULL, vkEnumerateInstanceExtensionProperties()
некуда записать счетчик свойств! Это, безусловно, приведет к нарушению прав доступа при попытке записи по адресу 0x0000000000000000.
Документация очищает состояния:
pPropertyCount
должно быть действительным указателем на uint32_t
значение
Кроме того, ваш вызов vkEnumerateInstanceExtensionProperties()
в любом случае просто логически неверен, поскольку третий параметр ожидает указатель на массив структур VkExtensionProperties
, но VulkanCreateInfo.ppEnabledExtensionNames
это указатель на массив const char*
строк UTF-8 вместо этого.
Другими словами, вам не следует использовать vkEnumerateInstanceExtensionProperties()
для инициализации критериев вызова vkCreateInstance()
. Вы совершенно неправильно используете vkEnumerateInstanceExtensionProperties()
. Вы, вероятно, хотели использовать SDL_Vulkan_GetInstanceExtensions()
вместо этого, например:
uint32_t ExtensionCount = 0;
if (!SDL_Vulkan_GetInstanceExtensions(NULL, &ExtensionCount, NULL))
{
...
}
const char **ExtensionNames = (const char **) SDL_malloc(sizeof(const char *) * ExtensionCount);
if (!ExtensionNames)
{
...
}
if (!SDL_Vulkan_GetInstanceExtensions(NULL, &ExtensionCount, ExtensionNames))
{
SDL_free(ExtensionNames);
...
}
VulkanCreateInfo.enabledExtensionCount = ExtensionCount;
VulkanCreateInfo.ppEnabledExtensionNames = ExtensionNames;
if (vkCreateInstance(&VulkanCreateInfo, 0, &VulkanInstance) != VK_SUCCESS)
{
...
}
SDL_free(ExtensionNames);
...