#include "surface.h" #include "window.h" #include "instance.h" Engine::Surface::Surface(const Instance* instance, const Window* window): vk(), instance(instance), window(window) { window->createSurface(instance->vk, &vk); } Engine::Surface::~Surface() { vkDestroySurfaceKHR(instance->vk, vk, nullptr); } bool Engine::Surface::isDeviceSutable(VkPhysicalDevice device) const { QueueFamilyIndices indices = findQueueFamilies(device); if (!indices.isComplete()) return false; return querySwapChainSupport(device).adequate(); } Engine::SwapChainSupportDetails Engine::Surface::querySwapChainSupport(VkPhysicalDevice device) const { SwapChainSupportDetails details; vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, vk, &details.capabilities); uint32_t formatCount; vkGetPhysicalDeviceSurfaceFormatsKHR(device, vk, &formatCount, nullptr); if (formatCount != 0) { details.formats.resize(formatCount); vkGetPhysicalDeviceSurfaceFormatsKHR(device, vk, &formatCount, details.formats.data()); } uint32_t presentModeCount; vkGetPhysicalDeviceSurfacePresentModesKHR(device, vk, &presentModeCount, nullptr); if (presentModeCount != 0) { details.presentModes.resize(presentModeCount); vkGetPhysicalDeviceSurfacePresentModesKHR(device, vk, &presentModeCount, details.presentModes.data()); } return details; } Engine::QueueFamilyIndices Engine::Surface::findQueueFamilies(VkPhysicalDevice device) const { QueueFamilyIndices indices; uint32_t queueFamilyCount = 0; vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr); std::vector queueFamilies(queueFamilyCount); vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); for (std::vector::size_type i = 0; i < queueFamilyCount; ++i) { const VkQueueFamilyProperties& queueFamily = queueFamilies[i]; if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) indices.graphicsFamily = i; VkBool32 presentSupport = false; vkGetPhysicalDeviceSurfaceSupportKHR(device, i, vk, &presentSupport); if (presentSupport) indices.presentFamily = i; if (indices.isComplete()) break; } return indices; } VkExtent2D Engine::Surface::chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities) const { return window->chooseSwapExtent(capabilities); } VkSurfaceFormatKHR Engine::Surface::chooseSwapSurfaceFormat(const SwapChainSupportDetails& swapChainSupport) const { return ::Engine::chooseSwapSurfaceFormat(swapChainSupport.formats); } VkExtent2D Engine::Surface::waitForResize() const { return window->waitForResize(); } VkExtent2D Engine::Surface::getSize() const { return window->getSize(); }