From 0dc2e035abd0d9368550e0450450722709924f93 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Thu, 10 Jul 2025 08:48:51 -0400 Subject: [PATCH] generic OpenGL device --- .../opengl/loader/opengl_instance_loader.c | 5 +-- .../src/device/opengl_physical_device.c | 35 +++++++++++++++++++ .../src/device/opengl_physical_device.h | 8 +++++ .../gryphn_physical_output_device.c | 4 +-- .../gryphn_physical_output_device.h | 8 ++--- 5 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 projects/apis/opengl/src/device/opengl_physical_device.c create mode 100644 projects/apis/opengl/src/device/opengl_physical_device.h diff --git a/projects/apis/opengl/loader/opengl_instance_loader.c b/projects/apis/opengl/loader/opengl_instance_loader.c index 33bcb00..05b664d 100644 --- a/projects/apis/opengl/loader/opengl_instance_loader.c +++ b/projects/apis/opengl/loader/opengl_instance_loader.c @@ -1,13 +1,14 @@ #include "opengl_loader.h" #include "instance/opengl_instance.h" #include "surface/opengl_surface.h" +#include "device/opengl_physical_device.h" gnInstanceFunctions loadOpenGLInstanceFunctions() { return (gnInstanceFunctions){ ._gnCreateInstance = createOpenGLInstance, ._gnDestroyInstance = destroyOpenGLInstance, - // ._gnGetPhysicalDevices = getMetalDevices, - // ._gnQueueCanPresentToSurface = metalCanQueuePresentToSurface, + ._gnGetPhysicalDevices = getOpenGLDevice, + ._gnQueueCanPresentToSurface = openGLQueueCanPresent, // ._gnCreateOutputDevice = createMetalOutputDevice, // ._gnDestroyOutputDevice = destroyMetalOutputDevice, #ifdef GN_PLATFORM_LINUX diff --git a/projects/apis/opengl/src/device/opengl_physical_device.c b/projects/apis/opengl/src/device/opengl_physical_device.c new file mode 100644 index 0000000..a2059cb --- /dev/null +++ b/projects/apis/opengl/src/device/opengl_physical_device.c @@ -0,0 +1,35 @@ +#include "opengl_physical_device.h" + +gnPhysicalDevice* getOpenGLDevice(gnInstanceHandle instance, uint32_t* deviceCount) { + *deviceCount = 1; + + gnPhysicalDevice* devices = malloc(sizeof(gnPhysicalDevice)); + + gnPhysicalDevice device = { + .physicalDevice = malloc(sizeof(gnPlatformPhysicalDevice)), + .features = { + .maxColorSamples = GN_SAMPLE_BIT_1, + .maxDepthSamples = GN_SAMPLE_BIT_1, + .maxMemoryAllocations = 0x40000000, + .maxPushConstantSize = 256 + }, + .properties = { + .deviceType = GN_DEDICATED_DEVICE, + .name = gnCreateString("Generic OpenGL device") + }, + .queueProperties = { + .queueCount = 1, + .queueProperties = (gnQueueProperties[1]){ + (gnQueueProperties){ + .queueCount = 1, + .queueType = GN_QUEUE_GRAPHICS + } + } + } + }; + devices[0] = device; + return devices; +} +gnBool openGLQueueCanPresent(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface) { + return gnTrue; +} diff --git a/projects/apis/opengl/src/device/opengl_physical_device.h b/projects/apis/opengl/src/device/opengl_physical_device.h new file mode 100644 index 0000000..111ceb4 --- /dev/null +++ b/projects/apis/opengl/src/device/opengl_physical_device.h @@ -0,0 +1,8 @@ +#pragma once +#include +#include "output_device/gryphn_physical_output_device.h" + +typedef struct gnPlatformPhysicalDevice_t {} gnPlatformPhysicalDevice; + +gnPhysicalDevice* getOpenGLDevice(gnInstanceHandle instance, uint32_t* deviceCount); +gnBool openGLQueueCanPresent(const gnPhysicalDevice device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface); diff --git a/projects/core/src/output_device/gryphn_physical_output_device.c b/projects/core/src/output_device/gryphn_physical_output_device.c index 4d2c886..1c56224 100644 --- a/projects/core/src/output_device/gryphn_physical_output_device.c +++ b/projects/core/src/output_device/gryphn_physical_output_device.c @@ -23,7 +23,7 @@ gnBool gnQueueCanPresentToSurface(const gnPhysicalDevice device, uint32_t queueI gnBool gnHasGraphicsQueue(const gnPhysicalDevice device) { for (int i = 0; i < device.queueProperties.queueCount; i++) { - if (device.queueProperties.queueProperties[i].queueType & GN_QUEUE_GRAPHICS) { + if ((device.queueProperties.queueProperties[i].queueType & GN_QUEUE_GRAPHICS) == GN_QUEUE_GRAPHICS) { return gnTrue; } } @@ -40,7 +40,7 @@ gnBool gnHasPresentQueue(const gnPhysicalDevice device, gnWindowSurfaceHandle wi int gnGetGraphicsQueueIndex(const gnPhysicalDevice device) { for (int i = 0; i < device.queueProperties.queueCount; i++) { - if (device.queueProperties.queueProperties[i].queueType & GN_QUEUE_GRAPHICS) { + if ((device.queueProperties.queueProperties[i].queueType & GN_QUEUE_GRAPHICS) == GN_QUEUE_GRAPHICS) { return i; break; } diff --git a/projects/core/src/output_device/gryphn_physical_output_device.h b/projects/core/src/output_device/gryphn_physical_output_device.h index 79c8f43..6fb3a62 100644 --- a/projects/core/src/output_device/gryphn_physical_output_device.h +++ b/projects/core/src/output_device/gryphn_physical_output_device.h @@ -29,10 +29,10 @@ typedef struct gnPhysicalDeviceFeatures { } gnPhysicalDeviceFeatures; typedef enum gnQueueTypeFlags { - GN_QUEUE_GRAPHICS = 1, - GN_QUEUE_COMPUTE = 2, - GN_QUEUE_TRANSFER = 4, - GN_QUEUE_SPARSE_BINDING = 8 + GN_QUEUE_GRAPHICS = 1 << 0, + GN_QUEUE_COMPUTE = 1 << 1, + GN_QUEUE_TRANSFER = 1 << 2, + GN_QUEUE_SPARSE_BINDING = 1 << 3 } gnQueueTypeFlags; typedef struct gnQueueProperties {