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
Joshua Goins a3704eb7a9 Improve surface and gfx context creation
This is laying some groundwork for a much better way
of determining the best GFX api to use at runtime, and
making it easier to support more GFX backends in the future.
2022-02-21 11:03:34 -05:00

45 lines
1.4 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)]);
}
metal_surface* create_metal_surface(platform::window_ptr window, void* surface_creation_info) {
auto layer = get_layer(index);
auto layer = (__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(renderers[get_window(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 = 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;
}