From f86d6b9a54704a368af1057ec15856779401016c Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Mon, 25 May 2026 09:16:17 -0400 Subject: [PATCH] redo code and add xlib surface loader interface --- .../dispatch/gryphn_instance_dispatch_table.h | 3 +++ .../src/surface/gryphn_metal_surface.h | 6 ++--- .../GryphnLoader/src/surface/gryphn_surface.h | 3 +++ .../src/surface/gryphn_xlib_surface.c | 6 +++++ .../src/surface/gryphn_xlib_surface.h | 13 +++++++++++ Gryphn/apis/GryphnVulkan/src/vulkan.c | 15 +++++++++++- main.cpp | 23 ++++++++----------- 7 files changed, 51 insertions(+), 18 deletions(-) create mode 100644 Gryphn/GryphnLoader/src/surface/gryphn_xlib_surface.c create mode 100644 Gryphn/GryphnLoader/src/surface/gryphn_xlib_surface.h diff --git a/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_instance_dispatch_table.h b/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_instance_dispatch_table.h index 1d88047..1368bf9 100644 --- a/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_instance_dispatch_table.h +++ b/Gryphn/GryphnLoader/src/instance/dispatch/gryphn_instance_dispatch_table.h @@ -3,11 +3,13 @@ #include "core/gryphn_format.h" #include "core/gryphn_present_mode.h" typedef struct gnMetalSurfaceCreateInfo gnMetalSurfaceCreateInfo; +typedef struct gnXlibSurfaceCreateInfo gnXlibSurfaceCreateInfo; typedef struct gnSurfaceCapabilities gnSurfaceCapabilities; typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties; typedef struct gnDeviceCreateInfo gnDeviceCreateInfo; typedef gnReturnCode (*PFN_gnCreateMetalSurface)(gnInstance, gnMetalSurfaceCreateInfo*, gnSurface*); +typedef gnReturnCode (*PFN_gnCreateXlibSurface)(gnInstance, gnXlibSurfaceCreateInfo*, gnSurface*); typedef gnReturnCode (*PFN_enumeratePhysicalDevices)(gnInstance, uint32_t*, gnPhysicalDevice*); typedef gnReturnCode (*PFN_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*); typedef gnReturnCode (*PFN_gnCreateDevice)(gnInstance, gnDeviceCreateInfo*, gnDevice); @@ -19,6 +21,7 @@ typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance); typedef struct gnInstanceDispatchTable { PFN_gnCreateMetalSurface createMetalSurface; + PFN_gnCreateXlibSurface createXlibSurface; PFN_gnGetSurfaceCapabilities getSurfaceCapabilities; PFN_gnGetSurfaceFormats getSurfaceFormats; PFN_gnGetSurfacePresentModes getSurfacePresentModes; diff --git a/Gryphn/GryphnLoader/src/surface/gryphn_metal_surface.h b/Gryphn/GryphnLoader/src/surface/gryphn_metal_surface.h index aab88da..0b683b0 100644 --- a/Gryphn/GryphnLoader/src/surface/gryphn_metal_surface.h +++ b/Gryphn/GryphnLoader/src/surface/gryphn_metal_surface.h @@ -1,11 +1,11 @@ #pragma once +#ifdef GN_USE_SURFACE_COCOA #include "gryphn_handle.h" #include "gryphn_return_code.h" -#ifndef GN_CA_METAL_LAYER -typedef struct CAMetalLayer CAMetalLayer; -#endif +#import typedef struct gnMetalSurfaceCreateInfo { CAMetalLayer* metalLayer; } gnMetalSurfaceCreateInfo; gnReturnCode gnCreateMetalSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface); +#endif diff --git a/Gryphn/GryphnLoader/src/surface/gryphn_surface.h b/Gryphn/GryphnLoader/src/surface/gryphn_surface.h index 4456586..342ebc0 100644 --- a/Gryphn/GryphnLoader/src/surface/gryphn_surface.h +++ b/Gryphn/GryphnLoader/src/surface/gryphn_surface.h @@ -1,5 +1,8 @@ #pragma once #include "gryphn_metal_surface.h" +#include "gryphn_xlib_surface.h" +#include "gryphn_return_code.h" +#include "gryphn_handle.h" #include "core/gryphn_vec2d.h" #include "core/gryphn_format.h" #include "core/gryphn_present_mode.h" diff --git a/Gryphn/GryphnLoader/src/surface/gryphn_xlib_surface.c b/Gryphn/GryphnLoader/src/surface/gryphn_xlib_surface.c new file mode 100644 index 0000000..7a9f182 --- /dev/null +++ b/Gryphn/GryphnLoader/src/surface/gryphn_xlib_surface.c @@ -0,0 +1,6 @@ +#include "gryphn_xlib_surface.h" +#include "instance/gryphn_instance.h" + +gnReturnCode gnCreateXlibSurface(gnInstance instance, gnXlibSurfaceCreateInfo* createInfo, gnSurface* surface) { + return instance->dispatchTable.createXlibSurface(instance, createInfo, surface); +} diff --git a/Gryphn/GryphnLoader/src/surface/gryphn_xlib_surface.h b/Gryphn/GryphnLoader/src/surface/gryphn_xlib_surface.h new file mode 100644 index 0000000..0565cef --- /dev/null +++ b/Gryphn/GryphnLoader/src/surface/gryphn_xlib_surface.h @@ -0,0 +1,13 @@ +#pragma once +#ifdef GN_USE_SURFACE_XLIB +#include "gryphn_handle.h" +#include "gryphn_return_code.h" + +#include "X11/Xlib.h" +typedef struct gnXlibSurfaceCreateInfo { + Display* dpy; + Window window; +} gnXlibSurfaceCreateInfo; + +gnReturnCode gnCreateXlibSurface(gnInstance instance, gnXlibSurfaceCreateInfo* createInfo, gnSurface* surface); +#endif diff --git a/Gryphn/apis/GryphnVulkan/src/vulkan.c b/Gryphn/apis/GryphnVulkan/src/vulkan.c index 4c01d3f..cc90243 100644 --- a/Gryphn/apis/GryphnVulkan/src/vulkan.c +++ b/Gryphn/apis/GryphnVulkan/src/vulkan.c @@ -4,6 +4,7 @@ #include "stdlib.h" #include #include "vulkan_functions.h" +#include "string.h" gnReturnCode vulkanCodeToGryphnCode(VkResult result) { if (result != VK_SUCCESS) { @@ -58,7 +59,19 @@ gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* info) { const char** extensions = malloc(sizeof(const char*) * info->enabledExtensionCount); int realEnabledExtensionCount = 0; for (int i = 0; i < info->enabledExtensionCount; i++) { - // zero supported vulkan extensions right now + if (strcmp(info->enabledExtensions[i], "GN_EXT_surface") == 0) { + extensions[realEnabledExtensionCount] = "VK_KHR_surface"; + realEnabledExtensionCount++; + // instance->dispatchTable.destroySurface = metalDestroySurface; + // instance->dispatchTable.getSurfaceCapabilities = metalGetSurfaceCapabilities; + // instance->dispatchTable.getSurfaceFormats = metalGetSurfaceFormats; + // instance->dispatchTable.getSurfacePresentModes = metalGetSurfacePresentModes; + } + if (strcmp(info->enabledExtensions[i], "GN_EXT_surface_xlib") == 0) { + extensions[realEnabledExtensionCount] = "VK_KHR_xlib_surface"; + realEnabledExtensionCount++; + // instance->dispatchTable.createMetalSurface = metalCreateSurface; + } } VkInstanceCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, diff --git a/main.cpp b/main.cpp index 19832ee..66acfe5 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,7 @@ +#define GN_USE_SURFACE_XLIB #include "Gryphn/gryphn.h" -#include #include "stdlib.h" +#include "iostream" #define GLFW_EXPOSE_NATIVE_X11 #include "glfw/include/GLFW/glfw3.h" #include "glfw/include/GLFW/glfw3native.h" @@ -15,7 +16,6 @@ } GLFWwindow* window; -CAMetalLayer* layer; gnVersion version = gnCreateVersion(1, 0, 0); gnInstance instance; gnPhysicalDevice pysicalDevice; @@ -79,17 +79,12 @@ void createDevice() { } void createSurface() { - // NSWindow* nswin = glfwGetCocoaWindow((GLFWwindow*)window); - // NSView* view = [nswin contentView]; - // layer = [CAMetalLayer layer]; - // [view setWantsLayer:YES]; - // [view setLayer:layer]; - // layer.contentsScale = [nswin backingScaleFactor]; + gnXlibSurfaceCreateInfo createInfo = { + .dpy = glfwGetX11Display(), + .window = glfwGetX11Window(window) + }; - // gnMetalSurfaceCreateInfo createInfo = { - // .metalLayer = layer - // }; - // CHECK(gnCreateMetalSurface(instance, &createInfo, &surface)); + CHECK(gnCreateXlibSurface(instance, &createInfo, &surface)); // gnSurfaceCapabilities capabilites; // gnGetSurfaceCapabilities(pysicalDevice, surface, &capabilites); @@ -115,7 +110,7 @@ int main() { try { createInstance(); createDevice(); - // createSurface(); + createSurface(); // createSwapchain(); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); @@ -125,7 +120,7 @@ int main() { return 0; } glfwDestroyWindow(window); - // gnDestroySurface(instance, &surface); + gnDestroySurface(instance, &surface); gnDestroyDevice(&device); gnDestroyInstance(&instance); }