Skip to content
Permalink
Browse files

metal: Use the existing cocoa code for creating a Metal view on macOS…

…. Fixes the renderer size when the window is resized.
  • Loading branch information
slime73 committed Dec 31, 2017
1 parent 48fea0c commit 047d387b2e3994de84a334e8f9af1ba9855d066f
Showing with 17 additions and 17 deletions.
  1. +17 −17 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 @@ @implementation METAL_TextureData

// !!! 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 @@ @implementation METAL_TextureData

#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 @@ static void METAL_ActivateRenderer(SDL_Renderer * renderer)
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;
}}

0 comments on commit 047d387

Please sign in to comment.