44 lines
1.3 KiB
Text
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;
|
|
}
|