diff options
Diffstat (limited to 'src/backend_mtl.m')
-rw-r--r-- | src/backend_mtl.m | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/src/backend_mtl.m b/src/backend_mtl.m index 9a99e14..b3cd224 100644 --- a/src/backend_mtl.m +++ b/src/backend_mtl.m @@ -3,20 +3,66 @@ #ifdef GPU_METAL #include <celeritas.h> +#define MTL_DEBUG_LAYER 1 + // Obj-C imports #import <Foundation/Foundation.h> #import <Metal/Metal.h> #import <MetalKit/MetalKit.h> #import <QuartzCore/CAMetalLayer.h> +#define GLFW_INCLUDE_NONE +#import <GLFW/glfw3.h> +#define GLFW_EXPOSE_NATIVE_COCOA +#import <GLFW/glfw3native.h> + // --- RAL types -struct gpu_device { - id<MTLDevice> id; -}; struct gpu_swapchain { int width, height; CAMetalLayer* swapchain; }; +typedef struct metal_context { + GLFWwindow* window; + NSWindow* metal_window; + + id<MTLDevice> device; + id<CAMetalDrawable> surface; + gpu_swapchain default_swapchain; + + id<MTLCommandQueue> command_queue; +} metal_context; + +static metal_context ctx; + +void ral_backend_init(const char* window_name, struct GLFWwindow* window) { + printf("loading Metal backend\n"); + + printf("gpu device creation\n"); + const id<MTLDevice> gpu = MTLCreateSystemDefaultDevice(); + ctx.device = gpu; + + printf("window init\n"); + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + glfwMakeContextCurrent(window); + NSWindow* nswindow = glfwGetCocoaWindow(window); + ctx.metal_window = nswindow; + + // effectively the "framebuffer" + CAMetalLayer* metal_layer = [CAMetalLayer layer]; + metal_layer.device = gpu; + metal_layer.pixelFormat = MTLPixelFormatBGRA8Unorm; + ctx.metal_window.contentView.layer = metal_layer; + ctx.metal_window.contentView.wantsLayer = true; + + printf("command queue creation\n"); + const id<MTLCommandQueue> queue = [ctx.device newCommandQueue]; + ctx.command_queue = queue; +} + +void ral_backend_shutdown() { + // no-op +} + #endif
\ No newline at end of file |