ScreenLockDetector/src/platform/vulkanwidget_macos.mm

63 lines
1.8 KiB
Plaintext
Raw Normal View History

#include "vulkanwidget_macos.h"
#ifdef __APPLE__
#import <QuartzCore/CAMetalLayer.h>
#import <AppKit/NSWindow.h>
#import <AppKit/NSView.h>
#include <QDebug>
void* createMetalLayer(void* nativeViewPtr)
{
@autoreleasepool {
NSView* view = (__bridge NSView*)nativeViewPtr;
if (!view) {
qDebug() << "createMetalLayer: Invalid NSView";
return nullptr;
}
// Create CAMetalLayer
CAMetalLayer* metalLayer = [CAMetalLayer layer];
if (!metalLayer) {
qDebug() << "createMetalLayer: Failed to create CAMetalLayer";
return nullptr;
}
// Configure the metal layer
metalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm;
metalLayer.framebufferOnly = YES;
// Get the content scale factor for retina displays
NSWindow* window = [view window];
CGFloat scaleFactor = window ? [window backingScaleFactor] : 1.0;
metalLayer.contentsScale = scaleFactor;
// Set the layer's drawable size to match the view
CGSize drawableSize = view.bounds.size;
drawableSize.width *= scaleFactor;
drawableSize.height *= scaleFactor;
metalLayer.drawableSize = drawableSize;
// Set view properties
[view setWantsLayer:YES];
[view setLayer:metalLayer];
qDebug() << "createMetalLayer: Successfully created CAMetalLayer"
<< "size:" << drawableSize.width << "x" << drawableSize.height
<< "scale:" << scaleFactor;
// Return retained pointer (caller must release)
return (void*)CFBridgingRetain(metalLayer);
}
}
void releaseMetalLayer(void* metalLayerPtr)
{
if (metalLayerPtr) {
CFRelease(metalLayerPtr);
qDebug() << "releaseMetalLayer: CAMetalLayer released";
}
}
#endif // __APPLE__