30 #if SDL_VIDEO_DRIVER_COCOA && (SDL_VIDEO_VULKAN || SDL_VIDEO_METAL)
47 SDL_cocoametalview *view = (__bridge SDL_cocoametalview *)userdata;
48 if (view.sdlWindowID ==
event->window.windowID) {
49 [view updateDrawableSize];
56 @implementation SDL_cocoametalview
61 return NSClassFromString(
@"CAMetalLayer");
65 - (BOOL)wantsUpdateLayer
73 - (CALayer*)makeBackingLayer
75 return [
self.class.layerClass layer];
78 - (instancetype)initWithFrame:(NSRect)frame
82 if ((
self = [super initWithFrame:
frame])) {
83 self.highDPI = highDPI;
84 self.sdlWindowID = windowID;
85 self.wantsLayer = YES;
88 self.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
92 [
self updateDrawableSize];
106 return METALVIEW_TAG;
109 - (
void)updateDrawableSize
111 CAMetalLayer *metalLayer = (CAMetalLayer *)
self.
layer;
112 NSSize
size =
self.bounds.size;
113 NSSize backingSize =
size;
119 backingSize = [
self convertSizeToBacking:size];
122 metalLayer.contentsScale = backingSize.height /
size.height;
123 metalLayer.drawableSize = NSSizeToCGSize(backingSize);
135 SDL_cocoametalview *newview;
138 newview = [[SDL_cocoametalview alloc] initWithFrame:view.frame
141 if (newview == nil) {
145 [view addSubview:newview];
156 SDL_cocoametalview *metalview = CFBridgingRelease(view);
157 [metalview removeFromSuperview];
165 SDL_cocoametalview* metalview = [view viewWithTag:METALVIEW_TAG];
167 CAMetalLayer *
layer = (CAMetalLayer*)metalview.layer;
170 *
w =
layer.drawableSize.width;
173 *
h =
layer.drawableSize.height;