@@ -206,6 +206,11 @@ VulkanDriver::VulkanDriver(VulkanPlatform* platform, VulkanContext& context,
206
206
: mPlatform (platform),
207
207
mResourceManager (driverConfig.handleArenaSize, driverConfig.disableHandleUseAfterFreeCheck,
208
208
driverConfig.disableHeapHandleTags),
209
+ // Note that we always create the default rendertarget before createDefaultRenderTarget(). We
210
+ // swap the content later when createDefaultRenderTarget() is called. This frees
211
+ // createDefaultRenderTarget() from being ordered with makeCurrent().
212
+ mDefaultRenderTarget(
213
+ fvkmemory::resource_ptr<VulkanRenderTarget>::construct(&mResourceManager )),
209
214
mAllocator(createAllocator(mPlatform ->getInstance (), mPlatform->getPhysicalDevice(),
210
215
mPlatform->getDevice())),
211
216
mContext(context),
@@ -698,8 +703,11 @@ void VulkanDriver::destroyProgram(Handle<HwProgram> ph) {
698
703
}
699
704
700
705
void VulkanDriver::createDefaultRenderTargetR (Handle<HwRenderTarget> rth, int ) {
701
- assert_invariant (!mDefaultRenderTarget );
702
- auto renderTarget = resource_ptr<VulkanRenderTarget>::make (&mResourceManager , rth);
706
+ assert_invariant (mDefaultRenderTarget ); // Default render target should already exist.
707
+
708
+ auto renderTarget = resource_ptr<VulkanRenderTarget>::make (&mResourceManager , rth,
709
+ std::move (std::move (*mDefaultRenderTarget .get ())));
710
+
703
711
mDefaultRenderTarget = renderTarget;
704
712
}
705
713
@@ -775,6 +783,7 @@ void VulkanDriver::destroyRenderTarget(Handle<HwRenderTarget> rth) {
775
783
776
784
auto rt = resource_ptr<VulkanRenderTarget>::cast (&mResourceManager , rth);
777
785
if (UTILS_UNLIKELY (rt == mDefaultRenderTarget )) {
786
+ // Note that this should only happen on driver shutdown.
778
787
mDefaultRenderTarget = {};
779
788
} else {
780
789
rt.dec ();
0 commit comments