Merge pull request #1080 from cdavis5e/display-timing-use-after-free
MVKSwapchainImage: Retain image and swapchain until presentation is done.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index c83e14b..7ae7849 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -2595,6 +2595,20 @@
MVKSwapchain* MVKDevice::createSwapchain(const VkSwapchainCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator) {
+#if MVK_MACOS
+ // If we have selected a high-power GPU and want to force the window system
+ // to use it, force the window system to use a high-power GPU by calling the
+ // MTLCreateSystemDefaultDevice function, and if that GPU is the same as the
+ // selected GPU, update the MTLDevice instance used by the MVKPhysicalDevice.
+ id<MTLDevice> mtlDevice = _physicalDevice->getMTLDevice();
+ if (_pMVKConfig->switchSystemGPU && !(mtlDevice.isLowPower || mtlDevice.isHeadless) ) {
+ id<MTLDevice> sysMTLDevice = MTLCreateSystemDefaultDevice();
+ if (mvkGetRegistryID(sysMTLDevice) == mvkGetRegistryID(mtlDevice)) {
+ _physicalDevice->replaceMTLDevice(sysMTLDevice);
+ }
+ }
+#endif
+
return new MVKSwapchain(this, pCreateInfo);
}
@@ -3191,20 +3205,6 @@
# define MVK_CONFIG_USE_COMMAND_POOLING 1
# endif
MVK_SET_FROM_ENV_OR_BUILD_BOOL(_useCommandPooling, MVK_CONFIG_USE_COMMAND_POOLING);
-
-#if MVK_MACOS
- // If we have selected a high-power GPU and want to force the window system
- // to use it, force the window system to use a high-power GPU by calling the
- // MTLCreateSystemDefaultDevice function, and if that GPU is the same as the
- // selected GPU, update the MTLDevice instance used by the MVKPhysicalDevice.
- id<MTLDevice> mtlDevice = _physicalDevice->getMTLDevice();
- if (_pMVKConfig->switchSystemGPU && !(mtlDevice.isLowPower || mtlDevice.isHeadless) ) {
- id<MTLDevice> sysMTLDevice = MTLCreateSystemDefaultDevice();
- if (mvkGetRegistryID(sysMTLDevice) == mvkGetRegistryID(mtlDevice)) {
- _physicalDevice->replaceMTLDevice(sysMTLDevice);
- }
- }
-#endif
}
void MVKDevice::enableFeatures(const VkDeviceCreateInfo* pCreateInfo) {
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPixelFormats.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPixelFormats.mm
index d937e7b..0a2a438 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPixelFormats.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPixelFormats.mm
@@ -1246,7 +1246,14 @@
if (_physicalDevice) {
modifyMTLFormatCapabilities(_physicalDevice->getMTLDevice());
} else {
+#if MVK_IOS_OR_TVOS
id<MTLDevice> mtlDevice = MTLCreateSystemDefaultDevice(); // temp retained
+#endif
+#if MVK_MACOS
+ NSArray<id<MTLDevice>>* mtlDevices = MTLCopyAllDevices(); // temp retained
+ id<MTLDevice> mtlDevice = [mtlDevices[0] retain]; // temp retained
+ [mtlDevices release]; // temp release
+#endif
modifyMTLFormatCapabilities(mtlDevice);
[mtlDevice release]; // release temp instance
}