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