support present modes and jazz
This commit is contained in:
@@ -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 {
|
||||
gnPhysicalDevice physicalDevice;
|
||||
uint32_t enabledExtensionCount;
|
||||
const char** enabledExtensions;
|
||||
} gnDeviceCreateInfo;
|
||||
|
||||
typedef struct gnDevice_t {
|
||||
|
||||
@@ -7,3 +7,4 @@ GN_HANDLE(gnInstance);
|
||||
GN_HANDLE(gnPhysicalDevice);
|
||||
GN_HANDLE(gnDevice);
|
||||
GN_IMPLEMENTATION_HANDLE(gnSurface);
|
||||
GN_IMPLEMENTATION_HANDLE(gnSwapchain);
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#pragma once
|
||||
#include "gryphn_handle.h"
|
||||
#include "core/gryphn_format.h"
|
||||
#include "core/gryphn_present_mode.h"
|
||||
typedef struct gnMetalSurfaceCreateInfo gnMetalSurfaceCreateInfo;
|
||||
typedef struct gnSurfaceCapabilities gnSurfaceCapabilities;
|
||||
typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties;
|
||||
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_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*);
|
||||
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_gnDestroyInstance)(gnInstance);
|
||||
|
||||
typedef struct gnInstanceDispatchTable {
|
||||
PFN_gnCreateMetalSurface createMetalSurface;
|
||||
PFN_gnGetSurfaceCapabilities getSurfaceCapabilities;
|
||||
PFN_gnGetSurfaceFormats getSurfaceFormats;
|
||||
PFN_gnGetSurfacePresentModes getSurfacePresentModes;
|
||||
PFN_gnDestroySurface destroySurface;
|
||||
PFN_enumeratePhysicalDevices enumeratePhysicalDevices;
|
||||
PFN_gnGetPhysicalDeviceProperties getPhysicalDeviceProperties;
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
#include "gryphn_surface.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) {
|
||||
return instance->dispatchTable.destroySurface(instance, surface);
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
#pragma once
|
||||
#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);
|
||||
|
||||
@@ -1,10 +1,57 @@
|
||||
#import <Metal/Metal.h>
|
||||
#include "../metal_functions.h"
|
||||
#include "core/gryphn_format.h"
|
||||
|
||||
gnReturnCode metalCreateSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface) {
|
||||
*surface = createInfo->metalLayer;
|
||||
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) {
|
||||
*surface = NULL;
|
||||
return GN_SUCCESS;
|
||||
|
||||
@@ -26,6 +26,9 @@ gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* info) {
|
||||
for (int i = 0; i < info->enabledExtensionCount; i++) {
|
||||
if (strcmp(info->enabledExtensions[i], "GN_EXT_surface") == 0) {
|
||||
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) {
|
||||
instance->dispatchTable.createMetalSurface = metalCreateSurface;
|
||||
|
||||
@@ -59,6 +59,11 @@ gnReturnCode metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysica
|
||||
gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device) {
|
||||
device->dispatchTable.destroyDevice = metalDestroyDevice;
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,11 +6,14 @@
|
||||
#include "stdint.h"
|
||||
#include "device/gryphn_physical_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 metalGetPhysicalDeviceProperties(gnPhysicalDevice device, gnPhysicalDeviceProperties* properties);
|
||||
gnReturnCode metalCreateDevice(gnInstance instance, gnDeviceCreateInfo* createInfo, gnDevice device);
|
||||
gnReturnCode metalDestroyDevice(gnDevice device);
|
||||
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);
|
||||
|
||||
@@ -22,6 +22,7 @@ GLFWwindow* window;
|
||||
CAMetalLayer* layer;
|
||||
gnVersion version = gnCreateVersion(1, 0, 0);
|
||||
gnInstance instance;
|
||||
gnPhysicalDevice pysicalDevice;
|
||||
gnDevice device;
|
||||
gnSurface surface;
|
||||
|
||||
@@ -68,8 +69,16 @@ void createDevice() {
|
||||
std::cout << "Name: " << properties.deviceName << "\n";
|
||||
}
|
||||
|
||||
pysicalDevice = devices[0];
|
||||
|
||||
const char* extensions[1] = {
|
||||
"GN_EXT_swapchain"
|
||||
};
|
||||
|
||||
gnDeviceCreateInfo createInfo = {
|
||||
.physicalDevice = devices[0]
|
||||
.physicalDevice = pysicalDevice,
|
||||
.enabledExtensionCount = 1,
|
||||
.enabledExtensions = extensions
|
||||
};
|
||||
CHECK(gnCreateDevice(instance, &createInfo, &device));
|
||||
}
|
||||
@@ -85,7 +94,14 @@ void createSurface() {
|
||||
gnMetalSurfaceCreateInfo createInfo = {
|
||||
.metalLayer = layer
|
||||
};
|
||||
CHECK(gnCreateMetalSurface(instance, &createInfo, &surface))
|
||||
CHECK(gnCreateMetalSurface(instance, &createInfo, &surface));
|
||||
|
||||
gnSurfaceCapabilities capabilites;
|
||||
gnGetSurfaceCapabilities(pysicalDevice, surface, &capabilites);
|
||||
}
|
||||
|
||||
void createSwapchain() {
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
@@ -105,6 +121,7 @@ int main() {
|
||||
createInstance();
|
||||
createDevice();
|
||||
createSurface();
|
||||
createSwapchain();
|
||||
while (!glfwWindowShouldClose(window)) {
|
||||
glfwPollEvents();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user