redo code and add xlib surface loader interface

This commit is contained in:
Gregory Wells
2026-05-25 09:16:17 -04:00
parent f39024c045
commit f86d6b9a54
7 changed files with 51 additions and 18 deletions
@@ -3,11 +3,13 @@
#include "core/gryphn_format.h" #include "core/gryphn_format.h"
#include "core/gryphn_present_mode.h" #include "core/gryphn_present_mode.h"
typedef struct gnMetalSurfaceCreateInfo gnMetalSurfaceCreateInfo; typedef struct gnMetalSurfaceCreateInfo gnMetalSurfaceCreateInfo;
typedef struct gnXlibSurfaceCreateInfo gnXlibSurfaceCreateInfo;
typedef struct gnSurfaceCapabilities gnSurfaceCapabilities; typedef struct gnSurfaceCapabilities gnSurfaceCapabilities;
typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties; typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties;
typedef struct gnDeviceCreateInfo gnDeviceCreateInfo; typedef struct gnDeviceCreateInfo gnDeviceCreateInfo;
typedef gnReturnCode (*PFN_gnCreateMetalSurface)(gnInstance, gnMetalSurfaceCreateInfo*, gnSurface*); 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_enumeratePhysicalDevices)(gnInstance, uint32_t*, gnPhysicalDevice*);
typedef gnReturnCode (*PFN_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*); typedef gnReturnCode (*PFN_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*);
typedef gnReturnCode (*PFN_gnCreateDevice)(gnInstance, gnDeviceCreateInfo*, gnDevice); typedef gnReturnCode (*PFN_gnCreateDevice)(gnInstance, gnDeviceCreateInfo*, gnDevice);
@@ -19,6 +21,7 @@ typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance);
typedef struct gnInstanceDispatchTable { typedef struct gnInstanceDispatchTable {
PFN_gnCreateMetalSurface createMetalSurface; PFN_gnCreateMetalSurface createMetalSurface;
PFN_gnCreateXlibSurface createXlibSurface;
PFN_gnGetSurfaceCapabilities getSurfaceCapabilities; PFN_gnGetSurfaceCapabilities getSurfaceCapabilities;
PFN_gnGetSurfaceFormats getSurfaceFormats; PFN_gnGetSurfaceFormats getSurfaceFormats;
PFN_gnGetSurfacePresentModes getSurfacePresentModes; PFN_gnGetSurfacePresentModes getSurfacePresentModes;
@@ -1,11 +1,11 @@
#pragma once #pragma once
#ifdef GN_USE_SURFACE_COCOA
#include "gryphn_handle.h" #include "gryphn_handle.h"
#include "gryphn_return_code.h" #include "gryphn_return_code.h"
#ifndef GN_CA_METAL_LAYER #import <QuartzCore/CAMetalLayer.h>
typedef struct CAMetalLayer CAMetalLayer;
#endif
typedef struct gnMetalSurfaceCreateInfo { typedef struct gnMetalSurfaceCreateInfo {
CAMetalLayer* metalLayer; CAMetalLayer* metalLayer;
} gnMetalSurfaceCreateInfo; } gnMetalSurfaceCreateInfo;
gnReturnCode gnCreateMetalSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface); gnReturnCode gnCreateMetalSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface);
#endif
@@ -1,5 +1,8 @@
#pragma once #pragma once
#include "gryphn_metal_surface.h" #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_vec2d.h"
#include "core/gryphn_format.h" #include "core/gryphn_format.h"
#include "core/gryphn_present_mode.h" #include "core/gryphn_present_mode.h"
@@ -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);
}
@@ -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
+14 -1
View File
@@ -4,6 +4,7 @@
#include "stdlib.h" #include "stdlib.h"
#include <vulkan/vulkan_core.h> #include <vulkan/vulkan_core.h>
#include "vulkan_functions.h" #include "vulkan_functions.h"
#include "string.h"
gnReturnCode vulkanCodeToGryphnCode(VkResult result) { gnReturnCode vulkanCodeToGryphnCode(VkResult result) {
if (result != VK_SUCCESS) { if (result != VK_SUCCESS) {
@@ -58,7 +59,19 @@ gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* info) {
const char** extensions = malloc(sizeof(const char*) * info->enabledExtensionCount); const char** extensions = malloc(sizeof(const char*) * info->enabledExtensionCount);
int realEnabledExtensionCount = 0; int realEnabledExtensionCount = 0;
for (int i = 0; i < info->enabledExtensionCount; i++) { 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 = { VkInstanceCreateInfo createInfo = {
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
+9 -14
View File
@@ -1,6 +1,7 @@
#define GN_USE_SURFACE_XLIB
#include "Gryphn/gryphn.h" #include "Gryphn/gryphn.h"
#include <iostream>
#include "stdlib.h" #include "stdlib.h"
#include "iostream"
#define GLFW_EXPOSE_NATIVE_X11 #define GLFW_EXPOSE_NATIVE_X11
#include "glfw/include/GLFW/glfw3.h" #include "glfw/include/GLFW/glfw3.h"
#include "glfw/include/GLFW/glfw3native.h" #include "glfw/include/GLFW/glfw3native.h"
@@ -15,7 +16,6 @@
} }
GLFWwindow* window; GLFWwindow* window;
CAMetalLayer* layer;
gnVersion version = gnCreateVersion(1, 0, 0); gnVersion version = gnCreateVersion(1, 0, 0);
gnInstance instance; gnInstance instance;
gnPhysicalDevice pysicalDevice; gnPhysicalDevice pysicalDevice;
@@ -79,17 +79,12 @@ void createDevice() {
} }
void createSurface() { void createSurface() {
// NSWindow* nswin = glfwGetCocoaWindow((GLFWwindow*)window); gnXlibSurfaceCreateInfo createInfo = {
// NSView* view = [nswin contentView]; .dpy = glfwGetX11Display(),
// layer = [CAMetalLayer layer]; .window = glfwGetX11Window(window)
// [view setWantsLayer:YES]; };
// [view setLayer:layer];
// layer.contentsScale = [nswin backingScaleFactor];
// gnMetalSurfaceCreateInfo createInfo = { CHECK(gnCreateXlibSurface(instance, &createInfo, &surface));
// .metalLayer = layer
// };
// CHECK(gnCreateMetalSurface(instance, &createInfo, &surface));
// gnSurfaceCapabilities capabilites; // gnSurfaceCapabilities capabilites;
// gnGetSurfaceCapabilities(pysicalDevice, surface, &capabilites); // gnGetSurfaceCapabilities(pysicalDevice, surface, &capabilites);
@@ -115,7 +110,7 @@ int main() {
try { try {
createInstance(); createInstance();
createDevice(); createDevice();
// createSurface(); createSurface();
// createSwapchain(); // createSwapchain();
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
glfwPollEvents(); glfwPollEvents();
@@ -125,7 +120,7 @@ int main() {
return 0; return 0;
} }
glfwDestroyWindow(window); glfwDestroyWindow(window);
// gnDestroySurface(instance, &surface); gnDestroySurface(instance, &surface);
gnDestroyDevice(&device); gnDestroyDevice(&device);
gnDestroyInstance(&instance); gnDestroyInstance(&instance);
} }