From fbc30509c4d9a9a338b2e31178c6ffce70e22e8b Mon Sep 17 00:00:00 2001 From: Greg Wells Date: Tue, 3 Jun 2025 14:14:49 -0400 Subject: [PATCH] surface handles --- include/gryphn/utils/gryphn_glfw_util.h | 2 +- .../metal/src/core/present/metal_present.m | 8 +++--- .../src/output_device/vulkan_output_device.c | 1 + .../output_device/vulkan_physical_device.c | 4 +-- .../vulkan_presentation_queue.c | 4 +-- .../src/vulkan_surface/vulkan_surface.m | 2 +- .../command_pool/gryphn_command_pool.h | 1 + src/core/debugger/gryphn_debugger.h | 2 -- src/core/framebuffer/gryphn_framebuffer.h | 1 + src/core/gryphn_handles.h | 9 +++++++ src/core/gryphn_platform_functions.h | 14 +++++------ src/core/instance/gryphn_instance.h | 4 +-- src/core/output_device/gryphn_output_device.h | 1 + .../gryphn_physical_output_device.c | 7 +++--- .../gryphn_physical_output_device.h | 10 ++++---- .../gryphn_graphics_pipeline.h | 1 + .../gryphn_presentation_queue.h | 2 +- src/core/window_surface/gryphn_surface.c | 22 ++++++++-------- src/core/window_surface/gryphn_surface.h | 25 +++++++++++-------- .../gryphn_surface_create_functions.c | 16 +++++++----- .../gryphn_surface_create_functions.h | 12 +++++---- 21 files changed, 83 insertions(+), 65 deletions(-) create mode 100644 src/core/gryphn_handles.h diff --git a/include/gryphn/utils/gryphn_glfw_util.h b/include/gryphn/utils/gryphn_glfw_util.h index fd85701..2b228af 100644 --- a/include/gryphn/utils/gryphn_glfw_util.h +++ b/include/gryphn/utils/gryphn_glfw_util.h @@ -14,7 +14,7 @@ #error "Must define GLFW_EXPOSE_NATIVE_COCOA on macos" #endif -static gnReturnCode gnCreateGLFWWindowSurface(struct gnWindowSurface_t* windowSurface, struct gnInstance_t* instance, GLFWwindow* window) { +static gnReturnCode gnCreateGLFWWindowSurface(gnWindowSurfaceHandle* windowSurface, struct gnInstance_t* instance, GLFWwindow* window) { gnMacOSWindowSurfaceInfo surfaceCreateInfo = { .layer = gnCreateCAMetalLayer(glfwGetCocoaWindow(window)) }; diff --git a/rendering_api/metal/src/core/present/metal_present.m b/rendering_api/metal/src/core/present/metal_present.m index 76c8653..b6b13c8 100644 --- a/rendering_api/metal/src/core/present/metal_present.m +++ b/rendering_api/metal/src/core/present/metal_present.m @@ -13,8 +13,8 @@ gnReturnCode gnPresentFn(struct gnOutputDevice_t* device, struct gnPresentInfo_t while (!info.waitSemaphores[i].semaphore->eventTriggered) {} } - info.presentationQueues->info.surface.windowSurface->layer.device = device->outputDevice->device; - id drawable = [info.presentationQueues->info.surface.windowSurface->layer nextDrawable]; + info.presentationQueues->info.surface->windowSurface->layer.device = device->outputDevice->device; + id drawable = [info.presentationQueues->info.surface->windowSurface->layer nextDrawable]; if (drawable == nil) { return GN_FAILED_TO_CREATE_FRAMEBUFFER; } @@ -51,8 +51,8 @@ gnReturnCode gnPresentFn(struct gnOutputDevice_t* device, struct gnPresentInfo_t device->outputDevice->executingCommandBuffer = commandBuffer; for (int i = 0; i < info.presentationQueueCount; i++) { - if (info.presentationQueues[i].info.imageSize.x != info.presentationQueues[i].info.surface.windowSurface->layer.drawableSize.width || - info.presentationQueues[i].info.imageSize.y != info.presentationQueues[i].info.surface.windowSurface->layer.drawableSize.height) { + if (info.presentationQueues[i].info.imageSize.x != info.presentationQueues[i].info.surface->windowSurface->layer.drawableSize.width || + info.presentationQueues[i].info.imageSize.y != info.presentationQueues[i].info.surface->windowSurface->layer.drawableSize.height) { return GN_SUBOPTIMAL_PRESENTATION_QUEUE; } } diff --git a/rendering_api/vulkan/src/output_device/vulkan_output_device.c b/rendering_api/vulkan/src/output_device/vulkan_output_device.c index 28b4bb7..18fb26f 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_output_device.c +++ b/rendering_api/vulkan/src/output_device/vulkan_output_device.c @@ -2,6 +2,7 @@ #include #include #include "vulkan_device_extensions.h" +#include "core/instance/gryphn_instance.h" #include diff --git a/rendering_api/vulkan/src/output_device/vulkan_physical_device.c b/rendering_api/vulkan/src/output_device/vulkan_physical_device.c index 0802ec7..5b66877 100644 --- a/rendering_api/vulkan/src/output_device/vulkan_physical_device.c +++ b/rendering_api/vulkan/src/output_device/vulkan_physical_device.c @@ -49,9 +49,9 @@ gnPhysicalDevice* gnGetPhysicalDevicesFn(gnInstanceHandle instance, uint32_t* de return outputDevices; } -gnBool gnQueueCanPresentToSurfaceFn(const struct gnPhysicalDevice_t device, uint32_t queueIndex, const struct gnWindowSurface_t windowSurface) { +gnBool gnQueueCanPresentToSurfaceFn(const struct gnPhysicalDevice_t device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface) { VkBool32 supportsPresent = false; - vkGetPhysicalDeviceSurfaceSupportKHR(device.physicalDevice->device, queueIndex, windowSurface.windowSurface->surface, &supportsPresent); + vkGetPhysicalDeviceSurfaceSupportKHR(device.physicalDevice->device, queueIndex, windowSurface->windowSurface->surface, &supportsPresent); if (supportsPresent) return gnTrue; return gnFalse; diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c index fa4e882..1f93932 100644 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c @@ -9,7 +9,7 @@ gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presentationQueue, const gnOutputDeviceHandle device, struct gnPresentationQueueInfo_t presentationInfo) { presentationQueue->presentationQueue = malloc(sizeof(struct gnPlatformPresentationQueue_t)); - vkSwapchainSupportDetails details = vkGetSwapchainSupport(device->physicalDevice.physicalDevice->device, presentationInfo.surface.windowSurface->surface); + vkSwapchainSupportDetails details = vkGetSwapchainSupport(device->physicalDevice.physicalDevice->device, presentationInfo.surface->windowSurface->surface); if (details.formatCount == 0) { gnDebuggerSetErrorMessage(device->instance->debugger, (gnMessageData){ @@ -51,7 +51,7 @@ gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presentationQueue, VkSwapchainCreateInfoKHR createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; - createInfo.surface = presentationInfo.surface.windowSurface->surface; + createInfo.surface = presentationInfo.surface->windowSurface->surface; createInfo.minImageCount = presentationInfo.minImageCount; createInfo.imageFormat = details.formats[index].format; diff --git a/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.m b/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.m index b7ecf67..1517376 100644 --- a/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.m +++ b/rendering_api/vulkan/src/vulkan_surface/vulkan_surface.m @@ -11,7 +11,7 @@ #include "vulkan/vulkan_metal.h" -gnReturnCode gnCreateMacOSWindowSurfaceFn(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { +gnReturnCode gnCreateMacOSWindowSurfaceFn(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { windowSurface->windowSurface = malloc(sizeof(gnPlatformWindowSurface)); VkMetalSurfaceCreateInfoEXT surfaceCreateInfo = {}; surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; diff --git a/src/core/command/command_pool/gryphn_command_pool.h b/src/core/command/command_pool/gryphn_command_pool.h index b3ce17e..a8d5219 100644 --- a/src/core/command/command_pool/gryphn_command_pool.h +++ b/src/core/command/command_pool/gryphn_command_pool.h @@ -1,6 +1,7 @@ #pragma once #include "stdint.h" #include +#include typedef struct gnCommandPoolInfo_t { uint32_t queueIndex; diff --git a/src/core/debugger/gryphn_debugger.h b/src/core/debugger/gryphn_debugger.h index 8b6131a..8aaea34 100644 --- a/src/core/debugger/gryphn_debugger.h +++ b/src/core/debugger/gryphn_debugger.h @@ -51,8 +51,6 @@ struct gnDebugger_t { gnInstanceHandle instance; }; #endif -typedef struct gnDebugger_t* gnDebuggerHandle; -typedef gnDebuggerHandle gnDebugger; gnReturnCode gnCreateDebugger(gnDebuggerHandle* debugger, const struct gnDebuggerInfo_t info); void gnDestroyDebugger(gnDebuggerHandle debugger); diff --git a/src/core/framebuffer/gryphn_framebuffer.h b/src/core/framebuffer/gryphn_framebuffer.h index 7271c3c..128b4cc 100644 --- a/src/core/framebuffer/gryphn_framebuffer.h +++ b/src/core/framebuffer/gryphn_framebuffer.h @@ -1,6 +1,7 @@ #pragma once #include "core/renderpass/gryphn_render_pass_descriptor.h" #include "core/textures/gryphn_texture.h" +#include "utils/math/gryphn_vec2.h" typedef struct gnFramebufferInfo_t { struct gnRenderPassDescriptor_t* renderPassDescriptor; diff --git a/src/core/gryphn_handles.h b/src/core/gryphn_handles.h new file mode 100644 index 0000000..161158a --- /dev/null +++ b/src/core/gryphn_handles.h @@ -0,0 +1,9 @@ +#pragma once + +#define GN_HANDLE(type) \ +typedef struct type##_t* type##Handle; \ +typedef struct type##_t* type + +GN_HANDLE(gnInstance); +GN_HANDLE(gnDebugger); +GN_HANDLE(gnWindowSurface); diff --git a/src/core/gryphn_platform_functions.h b/src/core/gryphn_platform_functions.h index 3cfb9a5..294af7a 100644 --- a/src/core/gryphn_platform_functions.h +++ b/src/core/gryphn_platform_functions.h @@ -27,7 +27,7 @@ typedef struct gnFunctions_t { void (*_gnDestroyDebugger)(gnDebuggerHandle debugger); gnPhysicalDevice* (*_gnGetPhysicalDevices)(gnInstanceHandle instance, uint32_t* count); - gnBool (*_gnQueueCanPresentToSurface)(const struct gnPhysicalDevice_t device, uint32_t queueIndex, const struct gnWindowSurface_t windowSurface); + gnBool (*_gnQueueCanPresentToSurface)(const struct gnPhysicalDevice_t device, uint32_t queueIndex, const gnWindowSurfaceHandle windowSurface); gnReturnCode (*_gnCreateOutputDevoce)(gnOutputDeviceHandle device, gnInstanceHandle instance, struct gnOutputDeviceInfo_t deviceInfo); @@ -37,24 +37,24 @@ typedef struct gnFunctions_t { #ifdef GN_PLATFORM_LINUX #ifdef GN_WINDOW_X11 - gnReturnCode (*_gnCreateX11WindowSurface)(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnX11WindowSurfaceInfo_t createInfo); + gnReturnCode (*_gnCreateX11WindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnX11WindowSurfaceInfo_t createInfo); #endif #ifdef GN_WINDOW_WAYLAND - gnReturnCode (*_gnCreateWaylandWindowSurface)(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo); + gnReturnCode (*_gnCreateWaylandWindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo); #endif #endif #ifdef GN_PLATFORM_WIN32 - gnReturnCode (*_gnCreateWin32WindowSurface)(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo); + gnReturnCode (*_gnCreateWin32WindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo); #endif #ifdef GN_PLATFORM_MACOS - gnReturnCode (*_gnCreateMacOSWindowSurface)(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo); + gnReturnCode (*_gnCreateMacOSWindowSurface)(gnWindowSurfaceHandle windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo); #endif - void (*_gnDestroyWindowSurface)(struct gnWindowSurface_t* windowSurface); - struct gnSurfaceDetails_t (*_gnGetSurfaceDetails)(struct gnWindowSurface_t* windowSurface, struct gnPhysicalDevice_t device); + void (*_gnDestroyWindowSurface)(gnWindowSurfaceHandle windowSurface); + struct gnSurfaceDetails_t (*_gnGetSurfaceDetails)(gnWindowSurfaceHandle windowSurface, struct gnPhysicalDevice_t device); } gnFunctions; #include "core/presentation_queue/gryphn_presentation_queue.h" diff --git a/src/core/instance/gryphn_instance.h b/src/core/instance/gryphn_instance.h index 72d0c30..3efddc8 100644 --- a/src/core/instance/gryphn_instance.h +++ b/src/core/instance/gryphn_instance.h @@ -1,11 +1,11 @@ #pragma once #include #include "core/gryphn_rendering_api.h" +#include "core/gryphn_handles.h" struct gnPlatformInstance_t; struct gnFunctions_t; struct gnDynamicLibrary_t; -typedef struct gnDebugger_t* gnDebuggerHandle; typedef struct gnInstanceInfo_t { gnString applicationName; @@ -33,8 +33,6 @@ struct gnInstance_t { gnDebuggerHandle debugger; }; #endif -typedef struct gnInstance_t* gnInstanceHandle; -typedef struct gnInstance_t* gnInstance; gnReturnCode gnCreateInstance(gnInstanceHandle* instance, struct gnInstanceInfo_t info); void gnInstanceAttachDebugger(gnInstanceHandle istance, gnDebuggerHandle debugger); diff --git a/src/core/output_device/gryphn_output_device.h b/src/core/output_device/gryphn_output_device.h index 77bdf22..a5d1583 100644 --- a/src/core/output_device/gryphn_output_device.h +++ b/src/core/output_device/gryphn_output_device.h @@ -1,5 +1,6 @@ #pragma once #include +#include struct gnPlatformOutputDevice_t; struct gnDeviceFunctions_t; diff --git a/src/core/output_device/gryphn_physical_output_device.c b/src/core/output_device/gryphn_physical_output_device.c index 1103ef9..10a287a 100644 --- a/src/core/output_device/gryphn_physical_output_device.c +++ b/src/core/output_device/gryphn_physical_output_device.c @@ -1,6 +1,5 @@ #include "gryphn_physical_output_device.h" #include "core/gryphn_platform_functions.h" -#include "core/window_surface/gryphn_surface.h" #include "stdio.h" gnPhysicalDevice* gnGetPhyscialDevices(gnInstanceHandle instance, uint32_t* count) { @@ -11,7 +10,7 @@ gnPhysicalDevice* gnGetPhyscialDevices(gnInstanceHandle instance, uint32_t* coun return devices; } -gnBool gnQueueCanPresentToSurface(const struct gnPhysicalDevice_t device, uint32_t queueIndex, const struct gnWindowSurface_t windowSurface) { +gnBool gnQueueCanPresentToSurface(const struct gnPhysicalDevice_t device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface) { if (queueIndex >= device.queueProperties.queueCount) { gnDebuggerSetErrorMessage(device.instance->debugger, (gnMessageData){ @@ -31,7 +30,7 @@ gnBool gnHasGraphicsQueue(const struct gnPhysicalDevice_t device) { } return gnFalse; } -gnBool gnHasPresentQueue(const struct gnPhysicalDevice_t device, struct gnWindowSurface_t windowSurface) { +gnBool gnHasPresentQueue(const struct gnPhysicalDevice_t device, gnWindowSurfaceHandle windowSurface) { for (int i = 0; i < device.queueProperties.queueCount; i++) { if (gnQueueCanPresentToSurface(device, i, windowSurface)) { return gnTrue; @@ -54,7 +53,7 @@ int gnGetGraphicsQueueIndex(const struct gnPhysicalDevice_t device) { ); return -1; } -int gnGetPresentQueueIndex(const struct gnPhysicalDevice_t device, struct gnWindowSurface_t windowSurface) { +int gnGetPresentQueueIndex(const struct gnPhysicalDevice_t device, gnWindowSurfaceHandle windowSurface) { for (int i = 0; i < device.queueProperties.queueCount; i++) { if (gnQueueCanPresentToSurface(device, i, windowSurface)) { return i; diff --git a/src/core/output_device/gryphn_physical_output_device.h b/src/core/output_device/gryphn_physical_output_device.h index 0630aef..67ff480 100644 --- a/src/core/output_device/gryphn_physical_output_device.h +++ b/src/core/output_device/gryphn_physical_output_device.h @@ -1,8 +1,8 @@ #pragma once -#include "core/instance/gryphn_instance.h" +#include "utils/strings/gryphn_string.h" +#include "core/gryphn_handles.h" struct gnPlatformPhysicalDevice_t; -struct gnWindowSurface_t; typedef enum gnDeviceType_e { GN_DEDICATED_DEVICE, GN_INTEGRATED_DEVICE, GN_EXTERNAL_DEVICE @@ -44,10 +44,10 @@ typedef struct gnPhysicalDevice_t { } gnPhysicalDevice; gnPhysicalDevice* gnGetPhyscialDevices(gnInstanceHandle instance, uint32_t* count); -gnBool gnQueueCanPresentToSurface(const struct gnPhysicalDevice_t device, uint32_t queueIndex, const struct gnWindowSurface_t windowSurface); +gnBool gnQueueCanPresentToSurface(const struct gnPhysicalDevice_t device, uint32_t queueIndex, gnWindowSurfaceHandle windowSurface); gnBool gnHasGraphicsQueue(const struct gnPhysicalDevice_t device); -gnBool gnHasPresentQueue(const struct gnPhysicalDevice_t device, struct gnWindowSurface_t windowSurface); +gnBool gnHasPresentQueue(const struct gnPhysicalDevice_t device, gnWindowSurfaceHandle windowSurface); int gnGetGraphicsQueueIndex(const struct gnPhysicalDevice_t device); -int gnGetPresentQueueIndex(const struct gnPhysicalDevice_t device, struct gnWindowSurface_t windowSurface); +int gnGetPresentQueueIndex(const struct gnPhysicalDevice_t device, gnWindowSurfaceHandle windowSurface); diff --git a/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h b/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h index 0377db2..04ab854 100644 --- a/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h +++ b/src/core/pipelines/graphics_pipeline/gryphn_graphics_pipeline.h @@ -3,6 +3,7 @@ #include #include #include +#include "utils/math/gryphn_vec2.h" typedef enum gnDynamicState_e { GN_DYNAMIC_VIEWPORT, diff --git a/src/core/presentation_queue/gryphn_presentation_queue.h b/src/core/presentation_queue/gryphn_presentation_queue.h index b839bfa..ec9e65c 100644 --- a/src/core/presentation_queue/gryphn_presentation_queue.h +++ b/src/core/presentation_queue/gryphn_presentation_queue.h @@ -8,7 +8,7 @@ typedef struct gnPresentationQueueInfo_t { uint32_t minImageCount; struct gnUInt2_t imageSize; - struct gnWindowSurface_t surface; + gnWindowSurfaceHandle surface; struct gnSurfaceFormat_t format; enum gnImageSharingMode_e imageSharingMode; uint32_t queueFamilyCount; diff --git a/src/core/window_surface/gryphn_surface.c b/src/core/window_surface/gryphn_surface.c index 5803e2c..b51adc8 100644 --- a/src/core/window_surface/gryphn_surface.c +++ b/src/core/window_surface/gryphn_surface.c @@ -1,22 +1,22 @@ #include "gryphn_surface.h" #include "core/gryphn_platform_functions.h" -void gnDestroyWindowSurface(struct gnWindowSurface_t *windowSurface) { +void gnDestroyWindowSurface(gnWindowSurfaceHandle windowSurface) { windowSurface->instance->functions->_gnDestroyWindowSurface(windowSurface); } struct gnSurfaceFormat_t* gnGetSupportedSurfaceFormats( - struct gnWindowSurface_t windowSurface, + gnWindowSurfaceHandle windowSurface, struct gnPhysicalDevice_t device, uint32_t* formatCount ) { - struct gnSurfaceDetails_t surfaceDetails = windowSurface.instance->functions->_gnGetSurfaceDetails(&windowSurface, device); + struct gnSurfaceDetails_t surfaceDetails = windowSurface->instance->functions->_gnGetSurfaceDetails(windowSurface, device); *formatCount = surfaceDetails.formatCount; return surfaceDetails.formats; } gnBool gnIsSurfaceFormatSupported( - struct gnWindowSurface_t windowSurface, + gnWindowSurfaceHandle windowSurface, struct gnPhysicalDevice_t device, struct gnSurfaceFormat_t format ) { @@ -31,7 +31,7 @@ gnBool gnIsSurfaceFormatSupported( } struct gnSurfaceFormat_t gnGetPreferredSurfaceFormat( - struct gnWindowSurface_t windowSurface, + gnWindowSurfaceHandle windowSurface, struct gnPhysicalDevice_t device, struct gnSurfaceFormat_t format ) { @@ -53,17 +53,17 @@ struct gnSurfaceFormat_t gnGetPreferredSurfaceFormat( return formats[0]; } -uint32_t gnGetMinImageCount(struct gnWindowSurface_t surface, struct gnPhysicalDevice_t device) { - struct gnSurfaceDetails_t surfaceDetails = surface.instance->functions->_gnGetSurfaceDetails(&surface, device); +uint32_t gnGetMinImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device) { + struct gnSurfaceDetails_t surfaceDetails = surface->instance->functions->_gnGetSurfaceDetails(surface, device); return surfaceDetails.minImageCount; } -uint32_t gnGetMaxImageCount(struct gnWindowSurface_t surface, struct gnPhysicalDevice_t device) { - struct gnSurfaceDetails_t surfaceDetails = surface.instance->functions->_gnGetSurfaceDetails(&surface, device); +uint32_t gnGetMaxImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device) { + struct gnSurfaceDetails_t surfaceDetails = surface->instance->functions->_gnGetSurfaceDetails(surface, device); return surfaceDetails.maxImageCount; } -uint32_t gnGetPreferredImageCount(struct gnWindowSurface_t surface, struct gnPhysicalDevice_t device) { - struct gnSurfaceDetails_t surfaceDetails = surface.instance->functions->_gnGetSurfaceDetails(&surface, device); +uint32_t gnGetPreferredImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device) { + struct gnSurfaceDetails_t surfaceDetails = surface->instance->functions->_gnGetSurfaceDetails(surface, device); uint32_t imageCount = surfaceDetails.minImageCount + 1; if (surfaceDetails.maxImageCount > 0 && imageCount > surfaceDetails.maxImageCount) { diff --git a/src/core/window_surface/gryphn_surface.h b/src/core/window_surface/gryphn_surface.h index 25c1ad7..7a2dab6 100644 --- a/src/core/window_surface/gryphn_surface.h +++ b/src/core/window_surface/gryphn_surface.h @@ -4,8 +4,6 @@ #include #include "core/output_device/gryphn_physical_output_device.h" -struct gnPlatformWindowSurface_t; - typedef struct gnSurfaceFormat_t { gnImageFormat format; gnColorSpace colorSpace; @@ -18,18 +16,23 @@ typedef struct gnSurfaceDetails_t { uint32_t minImageCount, maxImageCount; } gnSufaceDetails; -typedef struct gnWindowSurface_t { +#ifdef GN_REVEAL_IMPL +struct gnWindowSurface_t { struct gnPlatformWindowSurface_t* windowSurface; gnInstanceHandle instance; -} gnWindowSurface; -void gnDestroyWindowSurface(struct gnWindowSurface_t* windowSurface); +}; +#endif +// typedef struct gnWindowSurface_t* gnWindowSurfaceHandle; + + +void gnDestroyWindowSurface(gnWindowSurfaceHandle windowSurface); struct gnSurfaceFormat_t* gnGetSupportedSurfaceFormats( - struct gnWindowSurface_t windowSurface, + gnWindowSurfaceHandle windowSurface, struct gnPhysicalDevice_t device, uint32_t* formatCount ); gnBool gnIsSurfaceFormatSupported( - struct gnWindowSurface_t windowSurface, + gnWindowSurfaceHandle windowSurface, struct gnPhysicalDevice_t device, struct gnSurfaceFormat_t format ); @@ -37,10 +40,10 @@ gnBool gnIsSurfaceFormatSupported( // unless its not supported then it will give you the first supported surface format // at some point this function will attempt to give you the most simmilar surface format struct gnSurfaceFormat_t gnGetPreferredSurfaceFormat( - struct gnWindowSurface_t windowSurface, + gnWindowSurfaceHandle windowSurface, struct gnPhysicalDevice_t device, struct gnSurfaceFormat_t format ); -uint32_t gnGetMinImageCount(struct gnWindowSurface_t surface, struct gnPhysicalDevice_t device); -uint32_t gnGetMaxImageCount(struct gnWindowSurface_t surface, struct gnPhysicalDevice_t device); -uint32_t gnGetPreferredImageCount(struct gnWindowSurface_t surface, struct gnPhysicalDevice_t device); +uint32_t gnGetMinImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device); +uint32_t gnGetMaxImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device); +uint32_t gnGetPreferredImageCount(gnWindowSurfaceHandle surface, struct gnPhysicalDevice_t device); diff --git a/src/core/window_surface/gryphn_surface_create_functions.c b/src/core/window_surface/gryphn_surface_create_functions.c index 12ded4c..6799b0a 100644 --- a/src/core/window_surface/gryphn_surface_create_functions.c +++ b/src/core/window_surface/gryphn_surface_create_functions.c @@ -4,12 +4,14 @@ #ifdef GN_PLATFORM_LINUX #ifdef GN_WINDOW_X11 - gnReturnCode gnCreateX11WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnX11WindowSurfaceInfo_t createInfo) { + gnReturnCode gnCreateX11WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnX11WindowSurfaceInfo_t createInfo) { + *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); return instance->functions->_gnCreateX11WindowSurface(windowSurface, instance, createInfo); } #endif #ifdef GN_WINDOW_WAYLAND - gnReturnCode gnCreateWaylandWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo) { + gnReturnCode gnCreateWaylandWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo) { + *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); return instance->functions->_gnCreateWaylandWindowSurface(windowSurface, instance, createInfo); } #endif @@ -17,14 +19,16 @@ #ifdef GN_PLATFORM_WIN32 - gnReturnCode gnCreateWin32WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo) { + gnReturnCode gnCreateWin32WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo) { + *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); return instance->functions->_gnCreateWin32WindowSurface(windowSurface, instance, createInfo); } #endif #ifdef GN_PLATFORM_MACOS - gnReturnCode gnCreateMacOSWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { - windowSurface->instance = instance; - return instance->functions->_gnCreateMacOSWindowSurface(windowSurface, instance, createInfo); + gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo) { + *windowSurface = malloc(sizeof(struct gnWindowSurface_t)); + (*windowSurface)->instance = instance; + return instance->functions->_gnCreateMacOSWindowSurface(*windowSurface, instance, createInfo); } #endif diff --git a/src/core/window_surface/gryphn_surface_create_functions.h b/src/core/window_surface/gryphn_surface_create_functions.h index de093e3..2aa39fd 100644 --- a/src/core/window_surface/gryphn_surface_create_functions.h +++ b/src/core/window_surface/gryphn_surface_create_functions.h @@ -1,5 +1,7 @@ #pragma once -#include "gryphn_surface.h" +#include +#include "core/gryphn_handles.h" +#include "utils/gryphn_error_code.h" #ifdef GN_PLATFORM_LINUX #ifdef GN_WINDOW_X11 @@ -8,7 +10,7 @@ Window* window; } gnX11WindowSurfaceCreateInfo; - gnReturnCode gnCreateX11WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnX11WindowSurfaceInfo_t createInfo); + gnReturnCode gnCreateX11WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnX11WindowSurfaceInfo_t createInfo); #endif #ifdef GN_WINDOW_WAYLAND typedef struct gnWaylandWindowSurfaceInfo_t { @@ -16,7 +18,7 @@ wl_surface* surface; } gnWaylandWindowSurfaceInfo; - gnReturnCode gnCreateWaylandWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo); + gnReturnCode gnCreateWaylandWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWaylandWindowSurfaceInfo_t createInfo); #endif #endif @@ -27,7 +29,7 @@ HINSTANCE* instance; } gnWin32WindowSurfaceInfo; - gnReturnCode gnCreateWin32WindowSurface(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo); + gnReturnCode gnCreateWin32WindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnWin32WindowSurfaceInfo_t createInfo); #endif #ifdef GN_PLATFORM_MACOS @@ -35,5 +37,5 @@ CAMetalLayer* layer; } gnMacOSWindowSurfaceInfo; - gnReturnCode gnCreateMacOSWindowSurface(struct gnWindowSurface_t* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo); + gnReturnCode gnCreateMacOSWindowSurface(gnWindowSurfaceHandle* windowSurface, gnInstanceHandle instance, struct gnMacOSWindowSurfaceInfo_t createInfo); #endif