From 3e1aea0243f54e0b68baa3b19ac19f3d965484e0 Mon Sep 17 00:00:00 2001 From: omniscient <17525998+omnisci3nce@users.noreply.github.com> Date: Thu, 17 Oct 2024 16:49:11 +1100 Subject: start on metal backend --- src/backend_mtl.m | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) (limited to 'src/backend_mtl.m') 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 +#define MTL_DEBUG_LAYER 1 + // Obj-C imports #import #import #import #import +#define GLFW_INCLUDE_NONE +#import +#define GLFW_EXPOSE_NATIVE_COCOA +#import + // --- RAL types -struct gpu_device { - id id; -}; struct gpu_swapchain { int width, height; CAMetalLayer* swapchain; }; +typedef struct metal_context { + GLFWwindow* window; + NSWindow* metal_window; + + id device; + id surface; + gpu_swapchain default_swapchain; + + id 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 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 queue = [ctx.device newCommandQueue]; + ctx.command_queue = queue; +} + +void ral_backend_shutdown() { + // no-op +} + #endif \ No newline at end of file -- cgit v1.2.3-70-g09d2