63 lines
1.8 KiB
Plaintext
63 lines
1.8 KiB
Plaintext
#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__
|