Create Vulkan device

This commit is contained in:
Grayson Riffe 2025-02-09 01:25:14 -06:00
parent 89cdf712b8
commit 2b39c6e15b
2 changed files with 38 additions and 0 deletions

View File

@ -13,6 +13,9 @@ namespace nf::cli::render {
, m_physicalDevice()
, m_queueFIGraphics()
, m_queueFIPresent()
, m_device()
, m_queueGraphics()
, m_queuePresent()
{
NFLog("Initializing render engine");
m_window->setDisplay(m_display);
@ -21,6 +24,7 @@ namespace nf::cli::render {
createInstance();
createSurface(m_window->getHandle());
pickPhysicalDevice();
createDevice();
}
void RenderEngine::createInstance() {
@ -125,7 +129,38 @@ namespace nf::cli::render {
NFError("No Vulkan GPUs were found to be compatible");
}
void RenderEngine::createDevice() {
std::set<uint32_t> uniqueQueueFamilyIndices = { m_queueFIGraphics, m_queueFIPresent };
float queuePriority = 1.0f;
std::vector<VkDeviceQueueCreateInfo> queueCIs;
for (uint32_t currentQueueFamilyIndex : uniqueQueueFamilyIndices) {
VkDeviceQueueCreateInfo queueCI = { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO };
queueCI.queueFamilyIndex = currentQueueFamilyIndex;
queueCI.queueCount = 1;
queueCI.pQueuePriorities = &queuePriority;
queueCIs.push_back(queueCI);
}
VkPhysicalDeviceFeatures features = {};
VkDeviceCreateInfo deviceCI = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };
deviceCI.queueCreateInfoCount = queueCIs.size();
deviceCI.pQueueCreateInfos = queueCIs.data();
deviceCI.pEnabledFeatures = &features;
const char* swapChainExtName = VK_KHR_SWAPCHAIN_EXTENSION_NAME;
deviceCI.enabledExtensionCount = 1;
deviceCI.ppEnabledExtensionNames = &swapChainExtName;
if (vkCreateDevice(m_physicalDevice, &deviceCI, nullptr, &m_device) != VK_SUCCESS)
NFError("Could not create Vulkan device");
vkGetDeviceQueue(m_device, m_queueFIGraphics, 0, &m_queueGraphics);
vkGetDeviceQueue(m_device, m_queueFIPresent, 0, &m_queuePresent);
}
RenderEngine::~RenderEngine() {
vkDestroyDevice(m_device, nullptr);
vkDestroySurfaceKHR(m_instance, m_surface, nullptr);
vkDestroyInstance(m_instance, nullptr);
}

View File

@ -14,6 +14,7 @@ namespace nf::cli::render {
void createInstance();
void createSurface(HWND window);
void pickPhysicalDevice();
void createDevice();
std::shared_ptr<Window> m_window;
DisplayConfig m_display;
@ -22,5 +23,7 @@ namespace nf::cli::render {
VkSurfaceKHR m_surface;
VkPhysicalDevice m_physicalDevice;
uint32_t m_queueFIGraphics, m_queueFIPresent;
VkDevice m_device;
VkQueue m_queueGraphics, m_queuePresent;
};
}