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.
45 lines
1.4 KiB
Text
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;
|
|
}
|