//from the physicaldevice as a param, returns a grphics queueFamily cabable of a rendering pipeline. uint32_t FindGraphicsQueueFamilyIndex(VkPhysicalDevice vkPhysicalDevice, VkSurfaceKHR surface) { uint32_t queueCount = 0; uint32_t graphicsAndPresentingQueueIndex = 0; VkBool32 supportsPresent; vkGetPhysicalDeviceQueueFamilyProperties(vkPhysicalDevice, &queueCount, nullptr); Assert(queueCount > 0, "physical device has no available queues"); std::vector<VkQueueFamilyProperties> queueProperties(queueCount); vkGetPhysicalDeviceQueueFamilyProperties(vkPhysicalDevice, &queueCount, queueProperties.data()); for (; graphicsAndPresentingQueueIndex < queueCount; graphicsAndPresentingQueueIndex++) { GetPhysicalDeviceSurfaceSupportKHR(vkPhysicalDevice, graphicsAndPresentingQueueIndex, surface, &supportsPresent); if (queueProperties[graphicsAndPresentingQueueIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT && supportsPresent) break; } Assert(graphicsAndPresentingQueueIndex < queueCount, "this gpu doesn't support graphics rendering.... what a useful gpu"); return graphicsAndPresentingQueueIndex; }
void createSurface( #if defined(_WIN32) HINSTANCE windowInstance, HWND window #elif defined(__linux__) xcb_connection_t *connection, xcb_window_t window #endif ) { #if defined(_WIN32) VkWin32SurfaceCreateInfoKHR surfaceCreateInfo = {}; surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; surfaceCreateInfo.pNext = NULL; surfaceCreateInfo.flags = 0; surfaceCreateInfo.hinstance = windowInstance; surfaceCreateInfo.hwnd = window; VkResult result = vkCreateWin32SurfaceKHR(instance, &surfaceCreateInfo, NULL, &surface); #elif defined(__linux__) VkXcbSurfaceCreateInfoKHR surfaceCreateInfo = {}; surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; surfaceCreateInfo.pNext = NULL; surfaceCreateInfo.flags = 0; surfaceCreateInfo.connection = connection; surfaceCreateInfo.window = window; VkResult result = vkCreateXcbSurfaceKHR(instance, &surfaceCreateInfo, NULL, &surface); #endif assert(result == VK_SUCCESS); uint32_t queueCount = 0; vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueCount, NULL); assert(queueCount >= 1); std::vector<VkQueueFamilyProperties> queueProperties(queueCount); vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueCount, queueProperties.data()); queueIndex = UINT32_MAX; std::vector<VkBool32> supportsPresenting(queueCount); for (uint32_t i = 0; i < queueCount; i++) { fpGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, i, surface, &supportsPresenting[i]); if ((queueProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) { if (supportsPresenting[i] == VK_TRUE) { queueIndex = i; break; } } } assert(queueIndex != UINT32_MAX); uint32_t formatCount = 0; result = fpGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, NULL); assert(result == VK_SUCCESS && formatCount >= 1); std::vector<VkSurfaceFormatKHR> surfaceFormats(formatCount); result = fpGetPhysicalDeviceSurfaceFormatsKHR( physicalDevice, surface, &formatCount, surfaceFormats.data()); assert(result == VK_SUCCESS); if (formatCount == 1 && surfaceFormats[0].format == VK_FORMAT_UNDEFINED) colorFormat = VK_FORMAT_B8G8R8A8_UNORM; else colorFormat = surfaceFormats[0].format; colorSpace = surfaceFormats[0].colorSpace; }