metal: Use the existing cocoa code for creating a Metal view on macOS. Fixes the renderer size when the window is resized.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
diff --git a/src/render/metal/SDL_render_metal.m b/src/render/metal/SDL_render_metal.m
index f993881..3867503 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 <Cocoa/Cocoa.h>
+#include "../../video/cocoa/SDL_cocoametalview.h"
#else
#include "../../video/uikit/SDL_uikitmetalview.h"
#endif
-#include <Metal/Metal.h>
-#include <QuartzCore/CAMetalLayer.h>
+#import <Metal/Metal.h>
+#import <QuartzCore/CAMetalLayer.h>
/* 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;
}}