Это сокращенное сообщение об ошибке из проверочных слоев Vulkan
Invalid VkSurfaceKHR Object 0x1000000002.
Objects: 1
[0] 0x1000000002, type: 1000000000, name: NULL
, выданное этой функцией
populateQueueFamilies(&physicalDevice, &queueFamilyIndicesList, &queueFamilyCount, &surface);
Теперь этого не должно произойти, потому что
populatePhysicalDevice(&instance, &physicalDevice, &surface);
populateQueueFamilies(&physicalDevice, &queueFamilyIndicesList, &queueFamilyCount, &surface);
функция до того, как она также использует переменную surface
и не выдает никаких ошибок!
Я заглянул в некоторые функции печати, чтобы посмотреть, не так ли что-то с переменной, и вуаля
printf("%p\n", surface); // prints - 0x10000000001
populatePhysicalDevice(&instance, &physicalDevice, &surface);
printf("%p\n", surface); // prints - 0x10000000002
populateQueueFamilies(&physicalDevice, &queueFamilyIndicesList, &queueFamilyCount, &surface);
Я понимаю, что такого рода проблемы случаются, когда вы назначаете указателю адрес локальной переменной.
Но я не думаю, что это происходит здесь, потому что единственная функция, которая касается surface
var внутри populateQueueFamilies
, это вот это:
void populateSwapchainSupportDetails(SwapchainSupportDetails* gSwapchainSupportDetails,
VkPhysicalDevice* gPhysicalDevice,
VkSurfaceKHR* gSurface)
{
VkSurfaceCapabilitiesKHR lCapabilities;
uint32_t formatCount;
uint32_t presentModeCount;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(*gPhysicalDevice, *gSurface, &lCapabilities);
uint32_t gFormatCount;
vkGetPhysicalDeviceSurfaceFormatsKHR(*gPhysicalDevice, *gSurface, &gFormatCount, VK_NULL_HANDLE);
VkSurfaceFormatKHR lFormats[gFormatCount];
if (gFormatCount != 0)
{
vkGetPhysicalDeviceSurfaceFormatsKHR(*gPhysicalDevice, *gSurface, &gFormatCount, lFormats);
}
uint32_t gPresentModeCount;
vkGetPhysicalDeviceSurfacePresentModesKHR(*gPhysicalDevice, *gSurface, &gPresentModeCount, VK_NULL_HANDLE);
VkPresentModeKHR lPresentModes[gPresentModeCount];
if (gPresentModeCount != 0)
{
vkGetPhysicalDeviceSurfacePresentModesKHR(
*gPhysicalDevice, *gSurface, &gPresentModeCount, lPresentModes);
}
gSwapchainSupportDetails->capabilities = lCapabilities;
gSwapchainSupportDetails->formatCount = gFormatCount;
gSwapchainSupportDetails->presentModeCount = gPresentModeCount;
gSwapchainSupportDetails->formats = malloc(sizeof(lFormats));
memcpy(gSwapchainSupportDetails->formats, lFormats, sizeof(lFormats));
gSwapchainSupportDetails->formats = malloc(sizeof(lPresentModes));
memcpy(gSwapchainSupportDetails->formats, lPresentModes, sizeof(lPresentModes));
Есть временное исправление, которое работает:
VkSurfaceKHR surface1 = surface;
VkSurfaceKHR surface2 = surface;
и передача каждого surface(number)
различным функциям.