40 lines
1.1 KiB
Text
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;
|
|
}
|