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

40 lines
1.1 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;
SDL_Window* get_window(platform::window_ptr index);
CAMetalLayer* get_layer(platform::window_ptr index) {
return (__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(renderers[get_window(index)]);
}
// instance == MTL::Device
unsigned int platform::initialize_metal_layer(platform::window_ptr index, void* device) {
auto layer = get_layer(index);
layer.device = (__bridge id<MTLDevice>)device;
layer.allowsNextDrawableTimeout = true;
return (unsigned int)layer.pixelFormat;
}
void* platform::get_next_drawable(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;
}