1
0

Creating a window surface

This commit is contained in:
2023-05-04 23:02:42 +02:00
parent 3bc16b4626
commit b8e236d680

View File

@@ -11,14 +11,14 @@
#include <vector> #include <vector>
#include <cstring> #include <cstring>
#include <optional> #include <optional>
#include <set>
const uint32_t WIDTH = 800; const uint32_t WIDTH = 800;
const uint32_t HEIGHT = 600; const uint32_t HEIGHT = 600;
const std::vector<const char*> validationLayers ={ const std::vector<const char*> validationLayers ={
//"VK_LAYER_KHRONOS_validation" "VK_LAYER_KHRONOS_validation"
"VK_LAYER_LUNARG_standard_validation"
}; };
#ifdef NDEBUG #ifdef NDEBUG
@@ -42,10 +42,11 @@ class HelloTriangleApplication{
GLFWwindow* window; GLFWwindow* window;
VkInstance instance; VkInstance instance;
VkDebugUtilsMessengerEXT debugMessenger; VkDebugUtilsMessengerEXT debugMessenger;
VkSurfaceKHR surface;
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
VkDevice device; VkDevice device;
VkQueue graphicsQueue; VkQueue graphicsQueue;
VkQueue presentQueue;
void initWindow(){ void initWindow(){
glfwInit(); glfwInit();
@@ -59,30 +60,46 @@ class HelloTriangleApplication{
void initVulkan(){ void initVulkan(){
createInstance(); createInstance();
setupDebugMessenger(); setupDebugMessenger();
createSurface();
pickPhysicalDevice(); pickPhysicalDevice();
createLogicalDevice(); createLogicalDevice();
} }
void createSurface() {
if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) {
throw std::runtime_error("failed ot create window surface!");
}
}
void createLogicalDevice(){ void createLogicalDevice(){
QueueFamilyIndices indices = findQueueFamilies(physicalDevice); QueueFamilyIndices indices = findQueueFamilies(physicalDevice);
VkDeviceQueueCreateInfo queueCreateInfo {};
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; std::vector<VkDeviceQueueCreateInfo>queueCreateInfos;
queueCreateInfo.queueFamilyIndex = indices.graphicsFamily.value(); std::set<uint32_t> uniqueQueueFamilies = { indices.graphicsFamily.value(), indices.presentFamily.value() };
queueCreateInfo.queueCount = 1;
float queuePriority = 1.0f; float queuePriority = 1.0f;
queueCreateInfo.pQueuePriorities = &queuePriority; for (uint32_t queueFamily : uniqueQueueFamilies) {
VkDeviceQueueCreateInfo queueCreateInfo{};
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
queueCreateInfo.queueFamilyIndex = queueFamily;
queueCreateInfo.queueCount = 1;
queueCreateInfo.pQueuePriorities = &queuePriority;
queueCreateInfos.push_back(queueCreateInfo);
}
VkPhysicalDeviceFeatures deviceFeatures{}; VkPhysicalDeviceFeatures deviceFeatures{};
VkDeviceCreateInfo createInfo{}; VkDeviceCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.pQueueCreateInfos = &queueCreateInfo;
createInfo.queueCreateInfoCount = 1; createInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());
createInfo.pQueueCreateInfos = queueCreateInfos.data();
createInfo.pEnabledFeatures = &deviceFeatures; createInfo.pEnabledFeatures = &deviceFeatures;
createInfo.enabledExtensionCount = 0; createInfo.enabledExtensionCount = 0;
@@ -99,11 +116,9 @@ class HelloTriangleApplication{
vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0 , &graphicsQueue); vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0 , &graphicsQueue);
vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue);
} }
void pickPhysicalDevice(){ void pickPhysicalDevice(){
uint32_t deviceCount = 0; uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr); vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
@@ -142,9 +157,10 @@ class HelloTriangleApplication{
struct QueueFamilyIndices { struct QueueFamilyIndices {
std::optional<uint32_t> graphicsFamily; std::optional<uint32_t> graphicsFamily;
std::optional<uint32_t> presentFamily;
bool isComplete(){ bool isComplete(){
return graphicsFamily.has_value(); return graphicsFamily.has_value() && presentFamily.has_value();
} }
}; };
@@ -158,8 +174,20 @@ class HelloTriangleApplication{
std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount); std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
int i = 0; int i = 0;
for (const auto& queueFamily : queueFamilies){ for (const auto& queueFamily : queueFamilies){
VkBool32 presentSupport = false;
vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);
if (presentSupport) {
indices.presentFamily = i;
}
if(queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT){ if(queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT){
indices.graphicsFamily = i; indices.graphicsFamily = i;
} }
@@ -174,9 +202,6 @@ class HelloTriangleApplication{
return indices; return indices;
} }
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) { VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) {
auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT");
if (func != nullptr) { if (func != nullptr) {
@@ -186,7 +211,6 @@ class HelloTriangleApplication{
} }
} }
void setupDebugMessenger(){ void setupDebugMessenger(){
if(!enableValidationLayers) return; if(!enableValidationLayers) return;
@@ -303,6 +327,8 @@ class HelloTriangleApplication{
DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr); DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);
} }
vkDestroySurfaceKHR(instance, surface, nullptr);
vkDestroyInstance(instance, nullptr); vkDestroyInstance(instance, nullptr);
@@ -339,7 +365,6 @@ class HelloTriangleApplication{
}; };
int main ( ) { int main ( ) {
HelloTriangleApplication app; HelloTriangleApplication app;