From 047d387b2e3994de84a334e8f9af1ba9855d066f Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 31 Dec 2017 15:30:08 -0400 Subject: [PATCH] metal: Use the existing cocoa code for creating a Metal view on macOS. Fixes the renderer size when the window is resized. --- src/render/metal/SDL_render_metal.m | 34 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/render/metal/SDL_render_metal.m b/src/render/metal/SDL_render_metal.m index f993881f2..38675034a 100644 --- a/src/render/metal/SDL_render_metal.m +++ b/src/render/metal/SDL_render_metal.m @@ -29,12 +29,12 @@ #include "../SDL_sysrender.h" #ifdef __MACOSX__ -#include +#include "../../video/cocoa/SDL_cocoametalview.h" #else #include "../../video/uikit/SDL_uikitmetalview.h" #endif -#include -#include +#import +#import /* Regenerate these with build-metal-shaders.sh */ #ifdef __MACOSX__ @@ -279,21 +279,15 @@ METAL_CreateRenderer(SDL_Window * window, Uint32 flags) // !!! FIXME: error checking on all of this. - NSView *nsview = [syswm.info.cocoa.window contentView]; - - // CAMetalLayer is available in QuartzCore starting at OSX 10.11 - CAMetalLayer *layer = [NSClassFromString( @"CAMetalLayer" ) layer]; + NSView *view = Cocoa_Mtl_AddMetalView(window); + CAMetalLayer *layer = (CAMetalLayer *)[view layer]; layer.device = mtldevice; - //layer.pixelFormat = MTLPixelFormatBGRA8Unorm; // !!! FIXME: MTLPixelFormatBGRA8Unorm_sRGB ? + + // !!! FIXME: We might want this to be NO for RenderReadPixels. layer.framebufferOnly = YES; - //layer.drawableSize = (CGSize) [nsview convertRectToBacking:[nsview bounds]].size; //layer.colorspace = nil; - [nsview setWantsLayer:YES]; - [nsview setLayer:layer]; - - [layer retain]; #else UIView *view = UIKit_Mtl_AddMetalView(window); CAMetalLayer *layer = (CAMetalLayer *)[view layer]; @@ -358,7 +352,7 @@ METAL_CreateRenderer(SDL_Window * window, Uint32 flags) #if defined(__MACOSX__) && defined(MAC_OS_X_VERSION_10_13) if (@available(macOS 10.13, *)) { - layer.displaySyncEnabled = (flags & SDL_RENDERER_PRESENTVSYNC) != 0; + data.mtllayer.displaySyncEnabled = (flags & SDL_RENDERER_PRESENTVSYNC) != 0; } else #endif { @@ -401,10 +395,16 @@ METAL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) static int METAL_GetOutputSize(SDL_Renderer * renderer, int *w, int *h) { @autoreleasepool { - METAL_ActivateRenderer(renderer); METAL_RenderData *data = (__bridge METAL_RenderData *) renderer->driverdata; - *w = (int) data.mtlbackbuffer.texture.width; - *h = (int) data.mtlbackbuffer.texture.height; + // !!! FIXME: We shouldn't need ActivateRenderer, but drawableSize is 0 + // in the first frame without it. + METAL_ActivateRenderer(renderer); + if (w) { + *w = (int)data.mtllayer.drawableSize.width; + } + if (h) { + *h = (int)data.mtllayer.drawableSize.height; + } return 0; }}