Как определяется размер поверхности в Вулкане? - PullRequest
0 голосов
/ 07 января 2020

Я следую Учебному пособию по Vulkan, и в разделе Поверхность окна говорится, что Windows объект VkSurfaceKHR создается с использованием следующего кода:

VkWin32SurfaceCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
createInfo.hwnd = glfwGetWin32Window(window);
createInfo.hinstance = GetModuleHandle(nullptr);

if (vkCreateWin32SurfaceKHR(instance, &createInfo, nullptr, &surface) != VK_SUCCESS) {
    throw std::runtime_error("failed to create window surface!");
}

Но мы никогда не указывайте экстенты поверхности в объекте createInfo.

Однако при вызове функции vkGetPhysicalDeviceSurfaceCapabilitiesKHR возвращается объект VkSurfaceCapabilitiesKHR с полем currentExtent, которое согласно документации *

текущая ширина и высота поверхности или специальное значение (0xFFFFFFFF, 0xFFFFFFFF), указывающее, что размер поверхности будет определяться степенью свапчейна, нацеленного на поверхность.

Итак, в частном случае, когда currentExtent равно (0xFFFFFFFF, 0xFFFFFFFF), мы знаем, что размер поверхности определяется цепью свопинга, нацеленной на поверхность, но во всех других случаях кажется, что поверхность уже имеет размер, происходящий откуда-то еще, и мы должны соответствовать экстентам цепочки подкачки этому размеру.

Так, где же размер s urface приходит, когда он не определяется swapchain?

1 Ответ

2 голосов
/ 07 января 2020

При Windows начальные экстенты поверхности равны значениям ширины и высоты, которые вы задали при создании окна (минус границы окна, меню и т. Д. c.).

Экстенты значение, возвращаемое vkGetPhysicalDeviceSurfaceCapabilitiesKHR, также обновляется автоматически при изменении размера окна пользователем (на Windows).

Также важно отметить, что на разных платформах max, min и current экстенты ведут себя по-разному. На Windows выходная поверхность всегда должна быть равна размеру окрашиваемого окна, поэтому все они будут равны.

...