Skip to content

Commit 9f3aa5f

Browse files
GLTFLoader: refine lifetime of texture update callback user data objects
1 parent a9c328c commit 9f3aa5f

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

AssetLoader/src/GLTFLoader.cpp

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -383,8 +383,7 @@ struct TextureInitData : public ObjectBase<IObject>
383383
};
384384
std::vector<LevelData> Levels;
385385

386-
RefCntAutoPtr<ITexture> pStagingTex;
387-
RefCntAutoPtr<IRenderDevice> pDevice;
386+
RefCntAutoPtr<ITexture> pStagingTex;
388387

389388
std::atomic<Uint32> NumPendingUploads{0};
390389

@@ -728,7 +727,11 @@ float Model::GetTextureAlphaCutoffValue(int TextureIndex) const
728727
return std::max(AlphaCutoff, 0.f);
729728
}
730729

731-
void ScheduleAtlasUpdate(IGPUUploadManager* pUploadMgr, ITextureAtlasSuballocation* pAtlasSuballocation, ITextureLoader* pTexLoader)
730+
void ScheduleAtlasUpdate(IRenderDevice* pDevice,
731+
IGPUUploadManager* pUploadMgr,
732+
ITextureAtlasSuballocation* pAtlasSuballocation,
733+
ITextureLoader* pTexLoader,
734+
TextureInitData* pInitData)
732735
{
733736
const TextureDesc& SrcTexDesc = pTexLoader->GetTextureDesc();
734737
const TextureDesc& AtlasDesc = pAtlasSuballocation->GetAtlas()->GetAtlasDesc();
@@ -762,11 +765,17 @@ void ScheduleAtlasUpdate(IGPUUploadManager* pUploadMgr, ITextureAtlasSuballocati
762765
UpdateInfo.DstBox.MaxX = UpdateInfo.DstBox.MinX + MipProps.LogicalWidth;
763766
UpdateInfo.DstBox.MaxY = UpdateInfo.DstBox.MinY + MipProps.LogicalHeight;
764767

765-
pAtlasSuballocation->AddRef();
766-
UpdateInfo.pCopyTextureData = pAtlasSuballocation;
767-
768-
TextureInitData* pInitData = static_cast<TextureInitData*>(pAtlasSuballocation->GetUserData());
769-
VERIFY_EXPR(pInitData != nullptr);
768+
struct CopyTextureData
769+
{
770+
RefCntAutoPtr<ITextureAtlasSuballocation> pAtlasSuballocation;
771+
RefCntAutoPtr<TextureInitData> pInitData;
772+
RefCntAutoPtr<IRenderDevice> pDevice;
773+
};
774+
UpdateInfo.pCopyTextureData = new CopyTextureData{
775+
RefCntAutoPtr<ITextureAtlasSuballocation>{pAtlasSuballocation},
776+
RefCntAutoPtr<TextureInitData>{pInitData},
777+
RefCntAutoPtr<IRenderDevice>{pDevice},
778+
};
770779
pInitData->NumPendingUploads.fetch_add(1);
771780

772781
UpdateInfo.CopyTexture =
@@ -776,19 +785,17 @@ void ScheduleAtlasUpdate(IGPUUploadManager* pUploadMgr, ITextureAtlasSuballocati
776785
const Box& DstBox,
777786
const TextureSubResData& SrcData,
778787
void* pUserData) {
779-
ITextureAtlasSuballocation* pAtlasSuballocation = static_cast<ITextureAtlasSuballocation*>(pUserData);
780-
TextureInitData* pInitData = static_cast<TextureInitData*>(pAtlasSuballocation->GetUserData());
781-
VERIFY_EXPR(pInitData != nullptr);
788+
std::unique_ptr<CopyTextureData> CopyData{static_cast<CopyTextureData*>(pUserData)};
789+
ITextureAtlasSuballocation* pAtlasSuballocation = CopyData->pAtlasSuballocation;
782790
if (pContext != nullptr)
783791
{
784-
VERIFY_EXPR(pInitData->pDevice);
785-
ITexture* pAtlasTexture = pAtlasSuballocation->GetAtlas()->Update(pInitData->pDevice, pContext);
792+
ITexture* pAtlasTexture = pAtlasSuballocation->GetAtlas()->Update(CopyData->pDevice, pContext);
786793
pContext->UpdateTexture(pAtlasTexture, DstMipLevel, DstSlice, DstBox, SrcData,
787794
RESOURCE_STATE_TRANSITION_MODE_VERIFY,
788795
RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
789796
}
790-
pInitData->NumPendingUploads.fetch_sub(1);
791-
pAtlasSuballocation->Release();
797+
Uint32 PrevNumPendingUploads = CopyData->pInitData->NumPendingUploads.fetch_sub(1);
798+
VERIFY_EXPR(PrevNumPendingUploads > 0);
792799
};
793800

794801
UpdateInfo.CopyD3D11Texture =
@@ -800,15 +807,13 @@ void ScheduleAtlasUpdate(IGPUUploadManager* pUploadMgr, ITextureAtlasSuballocati
800807
Uint32 SrcX,
801808
Uint32 SrcY,
802809
void* pUserData) {
803-
ITextureAtlasSuballocation* pAtlasSuballocation = static_cast<ITextureAtlasSuballocation*>(pUserData);
804-
TextureInitData* pInitData = static_cast<TextureInitData*>(pAtlasSuballocation->GetUserData());
805-
VERIFY_EXPR(pInitData != nullptr);
810+
std::unique_ptr<CopyTextureData> CopyData{static_cast<CopyTextureData*>(pUserData)};
811+
ITextureAtlasSuballocation* pAtlasSuballocation = CopyData->pAtlasSuballocation;
806812
if (pContext != nullptr)
807813
{
808-
VERIFY_EXPR(pInitData->pDevice);
809814
CopyTextureAttribs CopyAttribs;
810815
CopyAttribs.pSrcTexture = pSrcTexture;
811-
CopyAttribs.pDstTexture = pAtlasSuballocation->GetAtlas()->Update(pInitData->pDevice, pContext);
816+
CopyAttribs.pDstTexture = pAtlasSuballocation->GetAtlas()->Update(CopyData->pDevice, pContext);
812817
CopyAttribs.DstMipLevel = DstMipLevel;
813818
CopyAttribs.DstSlice = DstSlice;
814819
CopyAttribs.DstX = DstBox.MinX;
@@ -830,8 +835,8 @@ void ScheduleAtlasUpdate(IGPUUploadManager* pUploadMgr, ITextureAtlasSuballocati
830835

831836
pContext->CopyTexture(CopyAttribs);
832837
}
833-
pInitData->NumPendingUploads.fetch_sub(1);
834-
pAtlasSuballocation->Release();
838+
Uint32 PrevNumPendingUploads = CopyData->pInitData->NumPendingUploads.fetch_sub(1);
839+
VERIFY_EXPR(PrevNumPendingUploads > 0);
835840
};
836841

837842
pUploadMgr->ScheduleTextureUpdate(UpdateInfo);
@@ -1024,8 +1029,7 @@ Uint32 Model::AddTexture(IRenderDevice* pDevice,
10241029

10251030
if (pUploadMgr != nullptr)
10261031
{
1027-
pTexInitData->pDevice = pDevice;
1028-
ScheduleAtlasUpdate(pUploadMgr, TexInfo.pAtlasSuballocation, pTexLoader);
1032+
ScheduleAtlasUpdate(pDevice, pUploadMgr, TexInfo.pAtlasSuballocation, pTexLoader, pTexInitData);
10291033
}
10301034
else
10311035
{

0 commit comments

Comments
 (0)