VulkanDevice: Fix for MacOS

This commit is contained in:
Stenzek
2023-08-24 18:02:55 +10:00
parent 64998b49dc
commit d750e4d417
4 changed files with 64 additions and 15 deletions

View File

@ -147,3 +147,50 @@ void CocoaTools::RemoveThemeChangeHandler(void* ctx)
assert([NSThread isMainThread]);
[s_themeChangeHandler removeCallback:ctx];
}
bool CocoaTools::CreateMetalLayer(WindowInfo *wi)
{
// Punt off to main thread if we're not calling from it already.
if (![NSThread isMainThread])
{
bool ret;
dispatch_sync(dispatch_get_main_queue(), [&ret, wi]() {
ret = CreateMetalLayer(wi);
});
return ret;
}
CAMetalLayer* layer = [CAMetalLayer layer];
if (layer == nil)
{
Log_ErrorPrint("Failed to create CAMetalLayer");
return false;
}
NSView* view = (__bridge NSView*)wi->window_handle;
[view setWantsLayer:TRUE];
[view setLayer:layer];
[layer setContentsScale:[[[view window] screen] backingScaleFactor]];
wi->surface_handle = (__bridge void*)layer;
return true;
}
void CocoaTools::DestroyMetalLayer(WindowInfo *wi)
{
if (!wi->surface_handle)
return;
// Punt off to main thread if we're not calling from it already.
if (![NSThread isMainThread])
{
dispatch_sync(dispatch_get_main_queue(), [wi]() { DestroyMetalLayer(wi); });
return;
}
NSView* view = (__bridge NSView*)wi->window_handle;
CAMetalLayer* layer = (__bridge CAMetalLayer*)wi->surface_handle;
[view setLayer:nil];
[view setWantsLayer:NO];
[layer release];
}