ctx - device
Some checks failed
Build / Build (push) Has been cancelled

This commit is contained in:
2026-04-14 18:49:35 -04:00
parent f5c4ac0790
commit b90c980bee
4 changed files with 78 additions and 0 deletions

View File

@@ -17,14 +17,19 @@ int main() {
GLFWwindow *window = OatmealUtils::initWindow("Oatmeal - createContext", 800, 600); GLFWwindow *window = OatmealUtils::initWindow("Oatmeal - createContext", 800, 600);
OatmealUtils::getLogger("context")->info("Creating context");
try { try {
Oatmeal::ctx ctx(window); 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) { } catch (const std::exception &e) {
OatmealUtils::getLogger("context")->critical("{}", e.what()); OatmealUtils::getLogger("context")->critical("{}", e.what());
return EXIT_FAILURE; return EXIT_FAILURE;
} }
OatmealUtils::getLogger("context")->info("Starting main loop");
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
glfwPollEvents(); glfwPollEvents();
} }

View File

@@ -0,0 +1,64 @@
#include <stdexcept>
#include "ctx.h"
#include "vulkan/vulkan.hpp"
#include "vulkan/vulkan_raii.hpp"
namespace Oatmeal {
void ctx::createLogicalDevice() {
std::vector<vk::QueueFamilyProperties> 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<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features,
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>
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<vk::PhysicalDeviceFeatures2>(),
.queueCreateInfoCount = 1,
.pQueueCreateInfos = &deviceQueueCreateInfo,
.enabledExtensionCount = static_cast<uint32_t>(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

View File

@@ -6,6 +6,8 @@ namespace Oatmeal {
m_window = window; m_window = window;
createSurface(); createSurface();
pickPhysicalDevice(); pickPhysicalDevice();
m_msaaSamples = getMaxUsableSampleCount();
createLogicalDevice();
} }
ctx::~ctx() {} ctx::~ctx() {}

View File

@@ -41,6 +41,10 @@ namespace Oatmeal {
class ctx { class ctx {
public: public:
ctx(GLFWwindow *window); ctx(GLFWwindow *window);
std::string getDeviceName() const;
std::string getDeviceType() const;
~ctx(); ~ctx();
private: private:
@@ -83,11 +87,14 @@ namespace Oatmeal {
void createInstance(); void createInstance();
std::vector<const char *> getRequiredExtensions(); std::vector<const char *> getRequiredExtensions();
void setupDebugMessenger(); void setupDebugMessenger();
void createSurface(); void createSurface();
void pickPhysicalDevice(); void pickPhysicalDevice();
bool isPhysicalDeviceSupported(vk::raii::PhysicalDevice device); bool isPhysicalDeviceSupported(vk::raii::PhysicalDevice device);
uint32_t scorePhysicalDevice(vk::raii::PhysicalDevice device); uint32_t scorePhysicalDevice(vk::raii::PhysicalDevice device);
vk::SampleCountFlagBits getMaxUsableSampleCount(); vk::SampleCountFlagBits getMaxUsableSampleCount();
void createLogicalDevice(); void createLogicalDevice();
}; };
} // namespace Oatmeal } // namespace Oatmeal