support present modes and jazz

This commit is contained in:
2026-05-09 01:42:30 -04:00
parent d9c1e8a345
commit 204383372d
13 changed files with 161 additions and 3 deletions
@@ -0,0 +1,29 @@
#pragma once
typedef enum gnFormat {
GN_FORMAT_UNDEFINED = 0,
GN_FORMAT_RGBA8_UNORM = 1,
GN_FORMAT_RGBA8_SNORM = 2,
GN_FORMAT_RGBA8_USCALED = 3,
GN_FORMAT_RGBA8_SSCALED = 4,
GN_FORMAT_RGBA8_UINT = 5,
GN_FORMAT_RGBA8_SINT = 6,
GN_FORMAT_RGBA8_SRGB = 7,
GN_FORMAT_BGRA8_UNORM = 8,
GN_FORMAT_BGRA8_SNORM = 9,
GN_FORMAT_BGRA8_USCALED = 10,
GN_FORMAT_BGRA8_SSCALED = 11,
GN_FORMAT_BGRA8_UINT = 12,
GN_FORMAT_BGRA8_SINT = 13,
GN_FORMAT_BGRA8_SRGB = 14,
} gnFormat;
typedef enum gnColorSpace {
GN_COLOR_SPACE_SRGB_NONLINEAR = 0,
} gnColorSpace;
typedef struct gnSurfaceFormat {
gnFormat format;
gnColorSpace colorSpace;
} gnSurfaceFormat;
@@ -0,0 +1,8 @@
#pragma once
typedef enum gnPresentMode {
GN_PRESENT_MODE_IMMEDIATE = 0,
GN_PRESENT_MODE_MAILBOX = 1,
GN_PRESENT_MODE_FIFO = 2,
GN_PRESENT_MODE_FIFO_RELAXED = 3,
} gnPresentMode;
@@ -0,0 +1,7 @@
#pragma once
#include "stdint.h"
typedef struct gnExtent2D {
uint32_t width;
uint32_t height;
} gnExtent2D;
@@ -4,6 +4,8 @@
typedef struct gnDeviceCreateInfo { typedef struct gnDeviceCreateInfo {
gnPhysicalDevice physicalDevice; gnPhysicalDevice physicalDevice;
uint32_t enabledExtensionCount;
const char** enabledExtensions;
} gnDeviceCreateInfo; } gnDeviceCreateInfo;
typedef struct gnDevice_t { typedef struct gnDevice_t {
+1
View File
@@ -7,3 +7,4 @@ GN_HANDLE(gnInstance);
GN_HANDLE(gnPhysicalDevice); GN_HANDLE(gnPhysicalDevice);
GN_HANDLE(gnDevice); GN_HANDLE(gnDevice);
GN_IMPLEMENTATION_HANDLE(gnSurface); GN_IMPLEMENTATION_HANDLE(gnSurface);
GN_IMPLEMENTATION_HANDLE(gnSwapchain);
@@ -1,6 +1,9 @@
#pragma once #pragma once
#include "gryphn_handle.h" #include "gryphn_handle.h"
#include "core/gryphn_format.h"
#include "core/gryphn_present_mode.h"
typedef struct gnMetalSurfaceCreateInfo gnMetalSurfaceCreateInfo; typedef struct gnMetalSurfaceCreateInfo gnMetalSurfaceCreateInfo;
typedef struct gnSurfaceCapabilities gnSurfaceCapabilities;
typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties; typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties;
typedef struct gnDeviceCreateInfo gnDeviceCreateInfo; typedef struct gnDeviceCreateInfo gnDeviceCreateInfo;
@@ -8,11 +11,17 @@ typedef gnReturnCode (*PFN_gnCreateMetalSurface)(gnInstance, gnMetalSurfaceCreat
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);
typedef gnReturnCode (*PFN_gnGetSurfaceFormats)(gnPhysicalDevice, gnSurface, uint32_t*, gnSurfaceFormat*);
typedef gnReturnCode (*PFN_gnGetSurfacePresentModes)(gnPhysicalDevice, gnSurface, uint32_t*, gnPresentMode*);
typedef gnReturnCode (*PFN_gnGetSurfaceCapabilities)(gnPhysicalDevice, gnSurface, gnSurfaceCapabilities*);
typedef gnReturnCode (*PFN_gnDestroySurface)(gnInstance, gnSurface*); typedef gnReturnCode (*PFN_gnDestroySurface)(gnInstance, gnSurface*);
typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance); typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance);
typedef struct gnInstanceDispatchTable { typedef struct gnInstanceDispatchTable {
PFN_gnCreateMetalSurface createMetalSurface; PFN_gnCreateMetalSurface createMetalSurface;
PFN_gnGetSurfaceCapabilities getSurfaceCapabilities;
PFN_gnGetSurfaceFormats getSurfaceFormats;
PFN_gnGetSurfacePresentModes getSurfacePresentModes;
PFN_gnDestroySurface destroySurface; PFN_gnDestroySurface destroySurface;
PFN_enumeratePhysicalDevices enumeratePhysicalDevices; PFN_enumeratePhysicalDevices enumeratePhysicalDevices;
PFN_gnGetPhysicalDeviceProperties getPhysicalDeviceProperties; PFN_gnGetPhysicalDeviceProperties getPhysicalDeviceProperties;
@@ -1,5 +1,17 @@
#include "gryphn_surface.h" #include "gryphn_surface.h"
#include "instance/gryphn_instance.h" #include "instance/gryphn_instance.h"
#include "device/gryphn_physical_device.h"
gnReturnCode gnGetSurfaceCapabilities(gnPhysicalDevice device, gnSurface surface, gnSurfaceCapabilities* capabilities) {
return device->instance->dispatchTable.getSurfaceCapabilities(device, surface, capabilities);
}
gnReturnCode gnGetSurfaceFormats(gnPhysicalDevice device, gnSurface surface, uint32_t* formatCount, gnSurfaceFormat* formats) {
return device->instance->dispatchTable.getSurfaceFormats(device, surface, formatCount, formats);
}
gnReturnCode gnGetSurfacePresentModes(gnPhysicalDevice device, gnSurface surface, uint32_t* presentModeCount, gnPresentMode* presentModes) {
return device->instance->dispatchTable.getSurfacePresentModes(device, surface, presentModeCount, presentModes);
}
gnReturnCode gnDestroySurface(gnInstance instance, gnSurface* surface) { gnReturnCode gnDestroySurface(gnInstance instance, gnSurface* surface) {
return instance->dispatchTable.destroySurface(instance, surface); return instance->dispatchTable.destroySurface(instance, surface);
@@ -1,4 +1,19 @@
#pragma once #pragma once
#include "gryphn_metal_surface.h" #include "gryphn_metal_surface.h"
#include "core/gryphn_vec2d.h"
#include "core/gryphn_format.h"
#include "core/gryphn_present_mode.h"
typedef struct gnSurfaceCapabilities {
uint32_t minImageCount;
uint32_t maxImageCount;
gnExtent2D currentExtent;
gnExtent2D minImageExtent;
gnExtent2D maxImageExtent;
uint32_t maxImageArrayLayers;
} gnSurfaceCapabilities;
gnReturnCode gnGetSurfaceCapabilities(gnPhysicalDevice device, gnSurface surface, gnSurfaceCapabilities* capabilities);
gnReturnCode gnGetSurfaceFormats(gnPhysicalDevice device, gnSurface surface, uint32_t* formatCount, gnSurfaceFormat* formats);
gnReturnCode gnGetSurfacePresentModes(gnPhysicalDevice device, gnSurface surface, uint32_t* presentModeCount, gnPresentMode* presentModes);
gnReturnCode gnDestroySurface(gnInstance instance, gnSurface* surface); gnReturnCode gnDestroySurface(gnInstance instance, gnSurface* surface);
@@ -1,10 +1,57 @@
#import <Metal/Metal.h>
#include "../metal_functions.h" #include "../metal_functions.h"
#include "core/gryphn_format.h"
gnReturnCode metalCreateSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface) { gnReturnCode metalCreateSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface) {
*surface = createInfo->metalLayer; *surface = createInfo->metalLayer;
return GN_SUCCESS; return GN_SUCCESS;
} }
gnReturnCode metalGetSurfaceCapabilities(gnPhysicalDevice device, gnSurface surface, gnSurfaceCapabilities* capabilities) {
CAMetalLayer* layer = surface;
capabilities->minImageCount = 2;
capabilities->maxImageCount = 3;
capabilities->currentExtent.width = (uint32_t)layer.drawableSize.width;
capabilities->currentExtent.height = (uint32_t)layer.drawableSize.height;
id<MTLDevice> mtlDevice = (id<MTLDevice>)device->internalData;
uint32_t maxTextureSize = 8192;
if ([mtlDevice respondsToSelector:@selector(supportsFamily:)]) {
if ([mtlDevice supportsFamily:MTLGPUFamilyApple1] ||
[mtlDevice supportsFamily:MTLGPUFamilyMac2]) {
maxTextureSize = 16384;
}
}
capabilities->minImageExtent = (gnExtent2D){ 1, 1 };
capabilities->maxImageExtent = (gnExtent2D){ maxTextureSize, maxTextureSize };
capabilities->maxImageArrayLayers = 1;
return GN_SUCCESS;
}
gnReturnCode metalGetSurfaceFormats(gnPhysicalDevice device, gnSurface surface, uint32_t* formatCount, gnSurfaceFormat* formats) {
gnSurfaceFormat supported[] = {
{ GN_FORMAT_BGRA8_UNORM, GN_COLOR_SPACE_SRGB_NONLINEAR },
{ GN_FORMAT_BGRA8_SRGB, GN_COLOR_SPACE_SRGB_NONLINEAR },
};
if (formats == NULL) {
*formatCount = 2;
return GN_SUCCESS;
}
for (uint32_t i = 0; i < 2; i++) {
formats[i] = supported[i];
}
return GN_SUCCESS;
}
gnReturnCode metalGetSurfacePresentModes(gnPhysicalDevice device, gnSurface surface, uint32_t* presentModeCount, gnPresentMode* presentModes) {
return GN_SUCCESS;
}
gnReturnCode metalDestroySurface(gnInstance instance, gnSurface* surface) { gnReturnCode metalDestroySurface(gnInstance instance, gnSurface* surface) {
*surface = NULL; *surface = NULL;
return GN_SUCCESS; return GN_SUCCESS;
+3
View File
@@ -26,6 +26,9 @@ gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* info) {
for (int i = 0; i < info->enabledExtensionCount; i++) { for (int i = 0; i < info->enabledExtensionCount; i++) {
if (strcmp(info->enabledExtensions[i], "GN_EXT_surface") == 0) { if (strcmp(info->enabledExtensions[i], "GN_EXT_surface") == 0) {
instance->dispatchTable.destroySurface = metalDestroySurface; instance->dispatchTable.destroySurface = metalDestroySurface;
instance->dispatchTable.getSurfaceCapabilities = metalGetSurfaceCapabilities;
instance->dispatchTable.getSurfaceFormats = metalGetSurfaceFormats;
instance->dispatchTable.getSurfacePresentModes = metalGetSurfacePresentModes;
} }
if (strcmp(info->enabledExtensions[i], "GN_EXT_surface_cocoa") == 0) { if (strcmp(info->enabledExtensions[i], "GN_EXT_surface_cocoa") == 0) {
instance->dispatchTable.createMetalSurface = metalCreateSurface; instance->dispatchTable.createMetalSurface = metalCreateSurface;
@@ -59,6 +59,11 @@ gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysica
gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device) { gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device) {
device->dispatchTable.destroyDevice = metalDestroyDevice; device->dispatchTable.destroyDevice = metalDestroyDevice;
device->internalData = createInfo->physicalDevice->internalData; device->internalData = createInfo->physicalDevice->internalData;
for (int i = 0; i < createInfo->enabledExtensionCount; i++) {
if (strcmp(createInfo->enabledExtensions[i], "GN_EXT_swapchain") == 0) {
}
}
return GN_SUCCESS; return GN_SUCCESS;
} }
@@ -6,11 +6,14 @@
#include "stdint.h" #include "stdint.h"
#include "device/gryphn_physical_device.h" #include "device/gryphn_physical_device.h"
#include "device/gryphn_device.h" #include "device/gryphn_device.h"
#include "surface/gryphn_metal_surface.h" #include "surface/gryphn_surface.h"
gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices); gnReturnCode metalEnumeratePhysicalDevices(gnInstance instance, uint32_t* deviceCount, gnPhysicalDevice* devices);
gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties); gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties);
gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device); gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device);
gnReturnCode metalDestroyDevice(gnDevice device); gnReturnCode metalDestroyDevice(gnDevice device);
gnReturnCode metalCreateSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface); gnReturnCode metalCreateSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface);
gnReturnCode metalGetSurfaceCapabilities(gnPhysicalDevice device, gnSurface surface, gnSurfaceCapabilities* capabilities);
gnReturnCode metalGetSurfaceFormats(gnPhysicalDevice device, gnSurface surface, uint32_t* formatCount, gnSurfaceFormat* formats);
gnReturnCode metalGetSurfacePresentModes(gnPhysicalDevice device, gnSurface surface, uint32_t* presentModeCount, gnPresentMode* presentModes);
gnReturnCode metalDestroySurface(gnInstance instance, gnSurface* surface); gnReturnCode metalDestroySurface(gnInstance instance, gnSurface* surface);
+19 -2
View File
@@ -22,6 +22,7 @@ GLFWwindow* window;
CAMetalLayer* layer; CAMetalLayer* layer;
gnVersion version = gnCreateVersion(1, 0, 0); gnVersion version = gnCreateVersion(1, 0, 0);
gnInstance instance; gnInstance instance;
gnPhysicalDevice pysicalDevice;
gnDevice device; gnDevice device;
gnSurface surface; gnSurface surface;
@@ -68,8 +69,16 @@ void createDevice() {
std::cout << "Name: " << properties.deviceName << "\n"; std::cout << "Name: " << properties.deviceName << "\n";
} }
pysicalDevice = devices[0];
const char* extensions[1] = {
"GN_EXT_swapchain"
};
gnDeviceCreateInfo createInfo = { gnDeviceCreateInfo createInfo = {
.physicalDevice = devices[0] .physicalDevice = pysicalDevice,
.enabledExtensionCount = 1,
.enabledExtensions = extensions
}; };
CHECK(gnCreateDevice(instance, &createInfo, &device)); CHECK(gnCreateDevice(instance, &createInfo, &device));
} }
@@ -85,7 +94,14 @@ void createSurface() {
gnMetalSurfaceCreateInfo createInfo = { gnMetalSurfaceCreateInfo createInfo = {
.metalLayer = layer .metalLayer = layer
}; };
CHECK(gnCreateMetalSurface(instance, &createInfo, &surface)) CHECK(gnCreateMetalSurface(instance, &createInfo, &surface));
gnSurfaceCapabilities capabilites;
gnGetSurfaceCapabilities(pysicalDevice, surface, &capabilites);
}
void createSwapchain() {
} }
int main() { int main() {
@@ -105,6 +121,7 @@ int main() {
createInstance(); createInstance();
createDevice(); createDevice();
createSurface(); createSurface();
createSwapchain();
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
glfwPollEvents(); glfwPollEvents();
} }