Skip to content

Commit bc83ffd

Browse files
authored
vk: make default render target independent of call order (#9065)
1 parent c21f211 commit bc83ffd

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

filament/backend/src/vulkan/VulkanDriver.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ VulkanDriver::VulkanDriver(VulkanPlatform* platform, VulkanContext& context,
206206
: mPlatform(platform),
207207
mResourceManager(driverConfig.handleArenaSize, driverConfig.disableHandleUseAfterFreeCheck,
208208
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)),
209214
mAllocator(createAllocator(mPlatform->getInstance(), mPlatform->getPhysicalDevice(),
210215
mPlatform->getDevice())),
211216
mContext(context),
@@ -698,8 +703,11 @@ void VulkanDriver::destroyProgram(Handle<HwProgram> ph) {
698703
}
699704

700705
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+
703711
mDefaultRenderTarget = renderTarget;
704712
}
705713

@@ -775,6 +783,7 @@ void VulkanDriver::destroyRenderTarget(Handle<HwRenderTarget> rth) {
775783

776784
auto rt = resource_ptr<VulkanRenderTarget>::cast(&mResourceManager, rth);
777785
if (UTILS_UNLIKELY(rt == mDefaultRenderTarget)) {
786+
// Note that this should only happen on driver shutdown.
778787
mDefaultRenderTarget = {};
779788
} else {
780789
rt.dec();

filament/backend/src/vulkan/VulkanHandles.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,15 @@ struct VulkanRenderTarget : private HwRenderTarget, fvkmemory::Resource {
308308
// Creates a special "default" render target (i.e. associated with the swap chain)
309309
explicit VulkanRenderTarget();
310310

311+
VulkanRenderTarget(VulkanRenderTarget&& target) {
312+
swap(std::move(target));
313+
}
314+
315+
VulkanRenderTarget& operator=(VulkanRenderTarget&& target) {
316+
swap(std::move(target));
317+
return *this;
318+
}
319+
311320
void transformClientRectToPlatform(VkRect2D* bounds) const;
312321

313322
void transformViewportToPlatform(VkViewport* bounds) const;
@@ -355,6 +364,12 @@ struct VulkanRenderTarget : private HwRenderTarget, fvkmemory::Resource {
355364
void emitBarriersEndRenderPass(VulkanCommandBuffer& commands);
356365

357366
private:
367+
void swap(VulkanRenderTarget&& target) {
368+
std::swap(mOffscreen, target.mOffscreen);
369+
std::swap(mProtected, target.mProtected);
370+
std::swap(mInfo, target.mInfo);
371+
}
372+
358373
struct Auxiliary {
359374
static constexpr int8_t UNDEFINED_INDEX = -1;
360375

@@ -368,7 +383,7 @@ struct VulkanRenderTarget : private HwRenderTarget, fvkmemory::Resource {
368383
int8_t msaaDepthIndex = UNDEFINED_INDEX;
369384
int8_t msaaIndex = UNDEFINED_INDEX;
370385
};
371-
bool const mOffscreen;
386+
bool mOffscreen;
372387
bool mProtected;
373388

374389
std::unique_ptr<Auxiliary> mInfo;

0 commit comments

Comments
 (0)