From b90c980bee2c5e848852fc09d97afddaf97feb9b Mon Sep 17 00:00:00 2001 From: firewire Date: Tue, 14 Apr 2026 18:49:35 -0400 Subject: [PATCH] ctx - device --- examples/createContext/main.cpp | 5 +++ oatmeal/src/ctx-device.cpp | 64 +++++++++++++++++++++++++++++++++ oatmeal/src/ctx.cpp | 2 ++ oatmeal/src/ctx.h | 7 ++++ 4 files changed, 78 insertions(+) create mode 100644 oatmeal/src/ctx-device.cpp diff --git a/examples/createContext/main.cpp b/examples/createContext/main.cpp index f12f7d8..9bfca2f 100644 --- a/examples/createContext/main.cpp +++ b/examples/createContext/main.cpp @@ -17,14 +17,19 @@ int main() { GLFWwindow *window = OatmealUtils::initWindow("Oatmeal - createContext", 800, 600); + + OatmealUtils::getLogger("context")->info("Creating context"); try { Oatmeal::ctx ctx(window); + OatmealUtils::getLogger("context")->info("Device name: {}", ctx.getDeviceName()); + OatmealUtils::getLogger("context")->info("Device name: {}", ctx.getDeviceType()); } catch (const std::exception &e) { OatmealUtils::getLogger("context")->critical("{}", e.what()); return EXIT_FAILURE; } + OatmealUtils::getLogger("context")->info("Starting main loop"); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); } diff --git a/oatmeal/src/ctx-device.cpp b/oatmeal/src/ctx-device.cpp new file mode 100644 index 0000000..8835a5b --- /dev/null +++ b/oatmeal/src/ctx-device.cpp @@ -0,0 +1,64 @@ +#include +#include "ctx.h" +#include "vulkan/vulkan.hpp" +#include "vulkan/vulkan_raii.hpp" + +namespace Oatmeal { + + void ctx::createLogicalDevice() { + std::vector queueFamilyProperties = m_physicalDevice.getQueueFamilyProperties(); + + m_queueIndex = ~0; + for (uint32_t qfpIndex = 0; qfpIndex < queueFamilyProperties.size(); qfpIndex++) { + if ((queueFamilyProperties[qfpIndex].queueFlags & vk::QueueFlagBits::eGraphics) && + m_physicalDevice.getSurfaceSupportKHR(qfpIndex, *m_surface)) { + m_queueIndex = qfpIndex; + break; + } + } + + if (m_queueIndex == ~0) { + // TODO: Find a better solution then just throwing a fit + throw std::runtime_error("Failed to find a queue that supports graphics and presentation"); + } + + vk::PhysicalDeviceFeatures deviceFeatures; + + vk::StructureChain + featureChain = { + {.features = {.samplerAnisotropy = true}}, + {.synchronization2 = true, .dynamicRendering = true}, + {.extendedDynamicState = true}, + }; + + float queuePriority = 0.5f; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo = { + .queueFamilyIndex = m_queueIndex, + .queueCount = 1, + .pQueuePriorities = &queuePriority, + }; + + vk::DeviceCreateInfo deviceCreateInfo = { + .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtensions.size()), + .ppEnabledExtensionNames = requiredDeviceExtensions.data(), + }; + + m_device = vk::raii::Device(m_physicalDevice, deviceCreateInfo); + m_queue = vk::raii::Queue(m_device, m_queueIndex, 0); + } + + + std::string ctx::getDeviceName() const { + const vk::PhysicalDeviceProperties deviceProperties = m_physicalDevice.getProperties(); + return deviceProperties.deviceName; + } + + std::string ctx::getDeviceType() const { + const vk::PhysicalDeviceProperties deviceProperties = m_physicalDevice.getProperties(); + return vk::to_string(deviceProperties.deviceType); + } +} // namespace Oatmeal diff --git a/oatmeal/src/ctx.cpp b/oatmeal/src/ctx.cpp index 929088d..0a5fb18 100644 --- a/oatmeal/src/ctx.cpp +++ b/oatmeal/src/ctx.cpp @@ -6,6 +6,8 @@ namespace Oatmeal { m_window = window; createSurface(); pickPhysicalDevice(); + m_msaaSamples = getMaxUsableSampleCount(); + createLogicalDevice(); } ctx::~ctx() {} diff --git a/oatmeal/src/ctx.h b/oatmeal/src/ctx.h index 73461ce..44ae493 100644 --- a/oatmeal/src/ctx.h +++ b/oatmeal/src/ctx.h @@ -41,6 +41,10 @@ namespace Oatmeal { class ctx { public: ctx(GLFWwindow *window); + + std::string getDeviceName() const; + std::string getDeviceType() const; + ~ctx(); private: @@ -83,11 +87,14 @@ namespace Oatmeal { void createInstance(); std::vector getRequiredExtensions(); void setupDebugMessenger(); + void createSurface(); + void pickPhysicalDevice(); bool isPhysicalDeviceSupported(vk::raii::PhysicalDevice device); uint32_t scorePhysicalDevice(vk::raii::PhysicalDevice device); vk::SampleCountFlagBits getMaxUsableSampleCount(); + void createLogicalDevice(); }; } // namespace Oatmeal