Archived
1
Fork 0
This repository has been archived on 2025-04-12. You can view files and clone it, but cannot push or open issues or pull requests.
prism/platforms/sdl/sdl_metal.mm
2022-03-04 19:17:07 -05:00

44 lines
1.3 KiB
Text

#include "platform.hpp"
#import "QuartzCore/QuartzCore.hpp"
#include <map>
#include <SDL.h>
#import <Metal/Metal.h>
#import <QuartzCore/QuartzCore.h>
extern std::vector<SDL_Window*> windows;
extern std::map<SDL_Window*, SDL_Renderer*> 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<MTLDevice>)metal_surface_info->device;
layer.allowsNextDrawableTimeout = true;
auto return_surface = new metal_surface();
return_surface->format = static_cast<MTL::PixelFormat>(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;
}