mirror of https://github.com/encounter/SDL.git
metal: Use the existing cocoa code for creating a Metal view on macOS. Fixes the renderer size when the window is resized.
This commit is contained in:
parent
48fea0cee4
commit
047d387b2e
|
@ -29,12 +29,12 @@
|
||||||
#include "../SDL_sysrender.h"
|
#include "../SDL_sysrender.h"
|
||||||
|
|
||||||
#ifdef __MACOSX__
|
#ifdef __MACOSX__
|
||||||
#include <Cocoa/Cocoa.h>
|
#include "../../video/cocoa/SDL_cocoametalview.h"
|
||||||
#else
|
#else
|
||||||
#include "../../video/uikit/SDL_uikitmetalview.h"
|
#include "../../video/uikit/SDL_uikitmetalview.h"
|
||||||
#endif
|
#endif
|
||||||
#include <Metal/Metal.h>
|
#import <Metal/Metal.h>
|
||||||
#include <QuartzCore/CAMetalLayer.h>
|
#import <QuartzCore/CAMetalLayer.h>
|
||||||
|
|
||||||
/* Regenerate these with build-metal-shaders.sh */
|
/* Regenerate these with build-metal-shaders.sh */
|
||||||
#ifdef __MACOSX__
|
#ifdef __MACOSX__
|
||||||
|
@ -279,21 +279,15 @@ METAL_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
|
|
||||||
// !!! FIXME: error checking on all of this.
|
// !!! FIXME: error checking on all of this.
|
||||||
|
|
||||||
NSView *nsview = [syswm.info.cocoa.window contentView];
|
NSView *view = Cocoa_Mtl_AddMetalView(window);
|
||||||
|
CAMetalLayer *layer = (CAMetalLayer *)[view layer];
|
||||||
// CAMetalLayer is available in QuartzCore starting at OSX 10.11
|
|
||||||
CAMetalLayer *layer = [NSClassFromString( @"CAMetalLayer" ) layer];
|
|
||||||
|
|
||||||
layer.device = mtldevice;
|
layer.device = mtldevice;
|
||||||
//layer.pixelFormat = MTLPixelFormatBGRA8Unorm; // !!! FIXME: MTLPixelFormatBGRA8Unorm_sRGB ?
|
|
||||||
|
// !!! FIXME: We might want this to be NO for RenderReadPixels.
|
||||||
layer.framebufferOnly = YES;
|
layer.framebufferOnly = YES;
|
||||||
//layer.drawableSize = (CGSize) [nsview convertRectToBacking:[nsview bounds]].size;
|
|
||||||
//layer.colorspace = nil;
|
//layer.colorspace = nil;
|
||||||
|
|
||||||
[nsview setWantsLayer:YES];
|
|
||||||
[nsview setLayer:layer];
|
|
||||||
|
|
||||||
[layer retain];
|
|
||||||
#else
|
#else
|
||||||
UIView *view = UIKit_Mtl_AddMetalView(window);
|
UIView *view = UIKit_Mtl_AddMetalView(window);
|
||||||
CAMetalLayer *layer = (CAMetalLayer *)[view layer];
|
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 defined(__MACOSX__) && defined(MAC_OS_X_VERSION_10_13)
|
||||||
if (@available(macOS 10.13, *)) {
|
if (@available(macOS 10.13, *)) {
|
||||||
layer.displaySyncEnabled = (flags & SDL_RENDERER_PRESENTVSYNC) != 0;
|
data.mtllayer.displaySyncEnabled = (flags & SDL_RENDERER_PRESENTVSYNC) != 0;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
@ -401,10 +395,16 @@ METAL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
|
||||||
static int
|
static int
|
||||||
METAL_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)
|
METAL_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)
|
||||||
{ @autoreleasepool {
|
{ @autoreleasepool {
|
||||||
METAL_ActivateRenderer(renderer);
|
|
||||||
METAL_RenderData *data = (__bridge METAL_RenderData *) renderer->driverdata;
|
METAL_RenderData *data = (__bridge METAL_RenderData *) renderer->driverdata;
|
||||||
*w = (int) data.mtlbackbuffer.texture.width;
|
// !!! FIXME: We shouldn't need ActivateRenderer, but drawableSize is 0
|
||||||
*h = (int) data.mtlbackbuffer.texture.height;
|
// 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;
|
return 0;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue