Changeset b3671b5 in opengl-game for vulkan-game.cpp


Ignore:
Timestamp:
Jul 8, 2019, 9:03:04 PM (5 years ago)
Author:
Dmitry Portnoy <dmitry.portnoy@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
1c6cd5e
Parents:
909b51a
Message:

Create a window surface and presentation queue

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vulkan-game.cpp

    r909b51a rb3671b5  
    1313#include <iostream>
    1414#include <vector>
     15#include <set>
    1516#include <stdexcept>
    1617#include <cstdlib>
     
    3738struct QueueFamilyIndices {
    3839    optional<uint32_t> graphicsFamily;
     40    optional<uint32_t> presentFamily;
    3941
    4042    bool isComplete() {
    41         return graphicsFamily.has_value();
     43        return graphicsFamily.has_value() && presentFamily.has_value();
    4244    }
    4345};
     
    9496      VkInstance instance;
    9597      VkDebugUtilsMessengerEXT debugMessenger;
     98      VkSurfaceKHR surface;
     99
    96100      VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
    97101      VkDevice device;
     102
    98103      VkQueue graphicsQueue;
     104      VkQueue presentQueue;
    99105
    100106      // both SDL and GLFW create window functions return NULL on failure
     
    125131         createInstance();
    126132         setupDebugMessenger();
     133         createSurface();
    127134         pickPhysicalDevice();
    128135         createLogicalDevice();
     
    150157         createInfo.ppEnabledExtensionNames = extensions.data();
    151158
     159         cout << endl << "SDL extensions:" << endl;
     160         for (const char* extensionName : extensions) {
     161            cout << extensionName << endl;
     162         }
     163         cout << endl;
     164
    152165         VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo;
    153166         if (enableValidationLayers) {
     
    177190            throw runtime_error("failed to setup debug messenger!");
    178191         }
     192      }
     193
     194      void createSurface() {
     195         //SDL_Surface* screenSurface = nullptr;
     196
     197         if (!SDL_Vulkan_CreateSurface(window, instance, &surface)) {
     198            throw runtime_error("failed to create window surface!");
     199         }
     200
     201         /*
     202         if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) {
     203            throw runtime_error("failed to create window surface!");
     204         }
     205         */
    179206      }
    180207
     
    221248         QueueFamilyIndices indices = findQueueFamilies(physicalDevice);
    222249
    223          VkDeviceQueueCreateInfo queueCreateInfo = {};
    224          queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
    225          queueCreateInfo.queueFamilyIndex = indices.graphicsFamily.value();
    226          queueCreateInfo.queueCount = 1;
     250         vector<VkDeviceQueueCreateInfo> queueCreateInfos;
     251         set<uint32_t> uniqueQueueFamilies = {indices.graphicsFamily.value(), indices.presentFamily.value()};
    227252
    228253         float queuePriority = 1.0f;
    229          queueCreateInfo.pQueuePriorities = &queuePriority;
     254         for (uint32_t queueFamily : uniqueQueueFamilies) {
     255            VkDeviceQueueCreateInfo queueCreateInfo = {};
     256
     257            queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
     258            queueCreateInfo.queueFamilyIndex = queueFamily;
     259            queueCreateInfo.queueCount = 1;
     260            queueCreateInfo.pQueuePriorities = &queuePriority;
     261
     262            queueCreateInfos.push_back(queueCreateInfo);
     263         }
    230264
    231265         VkPhysicalDeviceFeatures deviceFeatures = {};
     
    234268         createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
    235269
    236          createInfo.pQueueCreateInfos = &queueCreateInfo;
    237          createInfo.queueCreateInfoCount = 1;
     270         createInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());;
     271         createInfo.pQueueCreateInfos = queueCreateInfos.data();
    238272
    239273         createInfo.pEnabledFeatures = &deviceFeatures;
     
    255289
    256290         vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicsQueue);
     291         vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue);
    257292      }
    258293
     
    295330            if (queueFamily.queueCount > 0 && queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
    296331               indices.graphicsFamily = i;
     332            }
     333
     334            VkBool32 presentSupport = false;
     335            vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);
     336
     337            if (queueFamily.queueCount > 0 && presentSupport) {
     338               indices.presentFamily = i;
    297339            }
    298340
     
    335377
    336378         /*
    337          SDL_Surface* screenSurface = nullptr;
    338          VkSurfaceKHR surface;
    339 
    340          if (!SDL_Vulkan_CreateSurface(window, instance, &surface)) {
    341             cout << "Couild not create Vulkan surface" << endl;
    342          }
    343 
    344379         screenSurface = SDL_GetWindowSurface(window);
    345380         cout << "Got here" << endl;
     
    375410         }
    376411
     412         vkDestroySurfaceKHR(instance, surface, nullptr);
    377413         vkDestroyInstance(instance, nullptr);
    378414
Note: See TracChangeset for help on using the changeset viewer.