#include "platform.hpp" #import "QuartzCore/QuartzCore.hpp" #include #include #import #import extern std::vector windows; extern std::map renderers; extern "C" SDL_Window* get_window(platform::window_ptr index); CAMetalLayer* get_layer(platform::window_ptr index) { return (__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(renderers[get_window(index)]); } void* create_metal_surface(platform::window_ptr window, void* surface_creation_info) { auto layer = get_layer(window); auto metal_surface_info = (metal_surface_creation_info*)surface_creation_info; layer.device = (__bridge id)metal_surface_info->device; layer.allowsNextDrawableTimeout = true; auto return_surface = new metal_surface(); return_surface->format = static_cast(layer.pixelFormat); return return_surface; } void* get_next_metal_drawable(platform::window_ptr window) { auto renderer = renderers[get_window(window)]; auto layer = get_layer(window); int width, height; SDL_GetRendererOutputSize(renderer, &width, &height); layer.drawableSize = CGSizeMake(width, height); auto drawable = (__bridge CA::MetalDrawable*)[layer nextDrawable]; drawable->retain(); return drawable; }