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


Ignore:
Timestamp:
Sep 23, 2019, 12:32:48 AM (5 years ago)
Author:
Dmitry Portnoy <dmp1488@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
502bd0b
Parents:
a0c5f28
Message:

In vulkangame, add code to create a logical device

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vulkan-game.cpp

    ra0c5f28 rc1c2021  
    22
    33#include <iostream>
     4#include <set>
    45
    56#include "consts.hpp"
     
    9899   createVulkanSurface();
    99100   pickPhysicalDevice(deviceExtensions);
     101   createLogicalDevice(validationLayers, deviceExtensions);
    100102}
    101103
     
    142144      renderScene();
    143145   }
     146
     147   vkDeviceWaitIdle(device);
    144148}
    145149
     
    153157
    154158void VulkanGame::cleanup() {
     159   cleanupSwapChain();
     160
     161   vkDestroyDevice(device, nullptr);
     162   vkDestroySurfaceKHR(instance, surface, nullptr);
     163
    155164   if (ENABLE_VALIDATION_LAYERS) {
    156165      VulkanUtils::destroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);
    157166   }
     167
    158168   vkDestroyInstance(instance, nullptr);
    159169
     
    164174   gui->shutdown();
    165175   delete gui;
     176}
     177
     178void VulkanGame::cleanupSwapChain() {
    166179}
    167180
     
    295308   return indices.isComplete() && extensionsSupported && swapChainAdequate && supportedFeatures.samplerAnisotropy;
    296309}
     310
     311void VulkanGame::createLogicalDevice(
     312      const vector<const char*> validationLayers,
     313      const vector<const char*>& deviceExtensions) {
     314   QueueFamilyIndices indices = VulkanUtils::findQueueFamilies(physicalDevice, surface);
     315
     316   vector<VkDeviceQueueCreateInfo> queueCreateInfos;
     317   set<uint32_t> uniqueQueueFamilies = { indices.graphicsFamily.value(), indices.presentFamily.value() };
     318
     319   float queuePriority = 1.0f;
     320   for (uint32_t queueFamily : uniqueQueueFamilies) {
     321      VkDeviceQueueCreateInfo queueCreateInfo = {};
     322      queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
     323      queueCreateInfo.queueFamilyIndex = queueFamily;
     324      queueCreateInfo.queueCount = 1;
     325      queueCreateInfo.pQueuePriorities = &queuePriority;
     326
     327      queueCreateInfos.push_back(queueCreateInfo);
     328   }
     329
     330   VkPhysicalDeviceFeatures deviceFeatures = {};
     331   deviceFeatures.samplerAnisotropy = VK_TRUE;
     332
     333   VkDeviceCreateInfo createInfo = {};
     334   createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
     335   createInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());
     336   createInfo.pQueueCreateInfos = queueCreateInfos.data();
     337
     338   createInfo.pEnabledFeatures = &deviceFeatures;
     339
     340   createInfo.enabledExtensionCount = static_cast<uint32_t>(deviceExtensions.size());
     341   createInfo.ppEnabledExtensionNames = deviceExtensions.data();
     342
     343   // These fields are ignored  by up-to-date Vulkan implementations,
     344   // but it's a good idea to set them for backwards compatibility
     345   if (ENABLE_VALIDATION_LAYERS) {
     346      createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
     347      createInfo.ppEnabledLayerNames = validationLayers.data();
     348   } else {
     349      createInfo.enabledLayerCount = 0;
     350   }
     351
     352   if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS) {
     353      throw runtime_error("failed to create logical device!");
     354   }
     355
     356   vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicsQueue);
     357   vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue);
     358}
Note: See TracChangeset for help on using the changeset viewer.