#include "SDL_internal.h"
#if defined(SDL_VIDEO_DRIVER_UIKIT) && (defined(SDL_VIDEO_VULKAN) || defined(SDL_VIDEO_METAL))
#include "../SDL_sysvideo.h"
#include "../../events/SDL_windowevents_c.h"
#import "SDL_uikitwindow.h"
#import "SDL_uikitmetalview.h"
@implementation SDL_uikitmetalview
+ (Class)layerClass
{
return [CAMetalLayer class];
}
- (instancetype)initWithFrame:(CGRect)frame
scale:(CGFloat)scale
{
if ((self = [super initWithFrame:frame])) {
self.tag = SDL_METALVIEW_TAG;
self.layer.contentsScale = scale;
[self updateDrawableSize];
}
return self;
}
- (void)layoutSubviews
{
[super layoutSubviews];
[self updateDrawableSize];
}
- (void)updateDrawableSize
{
CGSize size = self.bounds.size;
size.width *= self.layer.contentsScale;
size.height *= self.layer.contentsScale;
CAMetalLayer *metallayer = ((CAMetalLayer *)self.layer);
if (metallayer.drawableSize.width != size.width ||
metallayer.drawableSize.height != size.height) {
metallayer.drawableSize = size;
SDL_SendWindowEvent([self getSDLWindow], SDL_EVENT_WINDOW_METAL_VIEW_RESIZED, 0, 0);
}
}
@end
SDL_MetalView UIKit_Metal_CreateView(SDL_VideoDevice *_this, SDL_Window *window)
{
@autoreleasepool {
SDL_UIKitWindowData *data = (__bridge SDL_UIKitWindowData *)window->internal;
CGFloat scale = 1.0;
SDL_uikitmetalview *metalview;
if (window->flags & SDL_WINDOW_HIGH_PIXEL_DENSITY) {
#ifndef SDL_PLATFORM_VISIONOS
scale = data.uiwindow.screen.nativeScale;
#else
scale = 2.0;
#endif
}
metalview = [[SDL_uikitmetalview alloc] initWithFrame:data.uiwindow.bounds
scale:scale];
if (metalview == nil) {
SDL_OutOfMemory();
return NULL;
}
[metalview setSDLWindow:window];
return (void *)CFBridgingRetain(metalview);
}
}
void UIKit_Metal_DestroyView(SDL_VideoDevice *_this, SDL_MetalView view)
{
@autoreleasepool {
SDL_uikitmetalview *metalview = CFBridgingRelease(view);
if ([metalview isKindOfClass:[SDL_uikitmetalview class]]) {
[metalview setSDLWindow:NULL];
}
}
}
void *UIKit_Metal_GetLayer(SDL_VideoDevice *_this, SDL_MetalView view)
{
@autoreleasepool {
SDL_uikitview *uiview = (__bridge SDL_uikitview *)view;
return (__bridge void *)uiview.layer;
}
}
#endif