92 lines
2.8 KiB
C++
92 lines
2.8 KiB
C++
#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<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
|
|
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
|
|
|
|
for (std::vector<VkQueueFamilyProperties>::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();
|
|
}
|