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

45 lines
1.3 KiB
Text
Raw Normal View History

2022-02-18 14:36:38 -05:00
#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;
2022-03-04 19:17:07 -05:00
extern "C" SDL_Window* get_window(platform::window_ptr index);
2022-02-18 14:36:38 -05:00
CAMetalLayer* get_layer(platform::window_ptr index) {
return (__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(renderers[get_window(index)]);
}
2022-02-21 11:47:23 -05:00
void* create_metal_surface(platform::window_ptr window, void* surface_creation_info) {
auto layer = get_layer(window);
2022-02-18 14:36:38 -05:00
auto metal_surface_info = (metal_surface_creation_info*)surface_creation_info;
layer.device = (__bridge id<MTLDevice>)metal_surface_info->device;
2022-02-18 14:36:38 -05:00
layer.allowsNextDrawableTimeout = true;
auto return_surface = new metal_surface();
2022-02-21 11:47:23 -05:00
return_surface->format = static_cast<MTL::PixelFormat>(layer.pixelFormat);
return return_surface;
2022-02-18 14:36:38 -05:00
}
void* get_next_metal_drawable(platform::window_ptr window) {
2022-02-18 14:36:38 -05:00
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;
}