@@ -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