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_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;
@@ -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 <QuartzCore/CAMetalLayer.h>
typedef struct gnMetalSurfaceCreateInfo {
CAMetalLayer* metalLayer;
} gnMetalSurfaceCreateInfo;
gnReturnCode gnCreateMetalSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface);
#endif
@@ -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"
@@ -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 <vulkan/vulkan_core.h>
#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,
+9 -14
View File
@@ -1,6 +1,7 @@
#define GN_USE_SURFACE_XLIB
#include "Gryphn/gryphn.h"
#include <iostream>
#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);
}