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 {
|
typedef struct gnDeviceCreateInfo {
|
||||||
gnPhysicalDevice physicalDevice;
|
gnPhysicalDevice physicalDevice;
|
||||||
|
uint32_t enabledExtensionCount;
|
||||||
|
const char** enabledExtensions;
|
||||||
} gnDeviceCreateInfo;
|
} gnDeviceCreateInfo;
|
||||||
|
|
||||||
typedef struct gnDevice_t {
|
typedef struct gnDevice_t {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user