@@ -492,13 +492,6 @@ void LoadMeshFromSource(MeshPayloadImpl& Mesh,
492492 SetLoadStatus (Status);
493493}
494494
495- RefCntAutoPtr<MeshAssetImpl> CreateMeshAsset (std::atomic<RadientHandle>& NextAssetID,
496- RefCntAutoPtr<MeshPayloadImpl>&& pPayload)
497- {
498- const RadientHandle AssetID = NextAssetID.fetch_add (1 , std::memory_order_relaxed);
499- return MeshAssetImpl::Create (MakeRadientAssetURI (" mesh" , AssetID), std::move (pPayload));
500- }
501-
502495RefCntAutoPtr<MeshAssetImpl> CreateCachedMeshAsset (const char * CacheKey,
503496 RefCntAutoPtr<MeshPayloadImpl>&& pPayload)
504497{
@@ -554,85 +547,76 @@ RADIENT_STATUS RadientMeshAssetManager::CreateMesh(const RadientMeshCreateInfo&
554547 if (!ValidateMeshCreateInfo (MeshCI))
555548 return RADIENT_STATUS_INVALID_ARGUMENT ;
556549
550+ if (m_pThreadPool == nullptr )
551+ return RADIENT_STATUS_INVALID_OPERATION ;
552+
557553 const bool CanUploadMesh =
558554 m_pDevice != nullptr &&
559555 m_pResourceManager != nullptr &&
560556 m_pUploadManager != nullptr ;
561- if (CanUploadMesh && m_pThreadPool == nullptr )
562- return RADIENT_STATUS_INVALID_OPERATION ;
563-
564- RADIENT_STATUS SourceStatus = RADIENT_STATUS_OK ;
565557
566- auto CreateMeshPayloadFromCI =
567- [this , &MeshCI, CanUploadMesh, &SourceStatus]() -> RefCntAutoPtr<MeshPayloadImpl> {
568- std::unique_ptr<RadientMeshSource> pMeshSource = std::make_unique<RadientMeshSource>(MeshCI);
569- SourceStatus = pMeshSource->GetStatus ();
570- if (RADIENT_FAILED (SourceStatus))
571- return {};
558+ RefCntAutoPtr<MeshAssetImpl> pMeshAsset =
559+ MeshAssetImpl::Create (MakeRadientAssetURI (" mesh" , m_NextAssetID.fetch_add (1 , std::memory_order_relaxed)));
560+ VERIFY_EXPR (pMeshAsset != nullptr );
561+ if (!pMeshAsset)
562+ return RADIENT_STATUS_INVALID_OPERATION ;
572563
573- MeshStorage MeshData{CanUploadMesh ? RADIENT_STATUS_PENDING : RADIENT_STATUS_INVALID_OPERATION };
574- MeshData.GPUResourcesReady .store (false , std::memory_order_release);
564+ std::unique_ptr<RadientMeshSource> pMeshSource = std::make_unique<RadientMeshSource>(MeshCI);
575565
576- RefCntAutoPtr<MeshPayloadImpl> pMeshPayload = MeshPayloadImpl::Create (MeshAssetStorage{std::move (MeshData)});
577- VERIFY_EXPR (pMeshPayload != nullptr );
566+ pMeshAsset->QueryInterface (IID_RadientMeshAsset, ppMesh);
578567
579- if (CanUploadMesh)
568+ EnqueueAsyncWork (
569+ m_pThreadPool,
570+ [pMeshAsset,
571+ MeshCache = m_MeshCache.GetAccessor (),
572+ CanUploadMesh,
573+ pDevice = m_pDevice,
574+ pResourceManager = m_pResourceManager,
575+ pUploadManager = m_pUploadManager,
576+ pMeshSource = std::move (pMeshSource)](Uint32) mutable //
580577 {
581- EnqueueAsyncWork (
582- m_pThreadPool,
583- [pMeshPayload,
584- pDevice = m_pDevice,
585- pResourceManager = m_pResourceManager,
586- pUploadManager = m_pUploadManager,
587- pMeshSource = std::move (pMeshSource)](Uint32) mutable //
588- {
589- LoadMeshFromSource (*pMeshPayload, std::move (pMeshSource), pDevice, pResourceManager, pUploadManager);
590- return ASYNC_TASK_STATUS_COMPLETE ;
591- });
592- }
593-
594- return pMeshPayload;
595- };
596-
597- const bool HasCacheKey = MeshCI.CacheKey != nullptr && MeshCI.CacheKey [0 ] != ' \0 ' ;
598- RefCntAutoPtr<MeshPayloadImpl> pMeshPayload;
599- if (HasCacheKey)
600- {
601- auto [pCachedMeshPayload, PayloadCreated] =
602- m_MeshCache.GetOrCreate (
603- MeshCI.CacheKey ,
604- [&CreateMeshPayloadFromCI]() {
605- return CreateMeshPayloadFromCI ();
606- });
578+ const RADIENT_STATUS SourceStatus = pMeshSource->GetStatus ();
579+ if (RADIENT_FAILED (SourceStatus))
580+ {
581+ pMeshAsset->Fail (SourceStatus);
582+ return ASYNC_TASK_STATUS_COMPLETE ;
583+ }
607584
608- (void )PayloadCreated;
585+ const std::string CacheKey = pMeshSource->MakeCacheKey ();
586+ if (CacheKey.empty ())
587+ {
588+ pMeshAsset->Fail (RADIENT_STATUS_INVALID_OPERATION );
589+ return ASYNC_TASK_STATUS_COMPLETE ;
590+ }
609591
610- if (!pCachedMeshPayload)
611- {
612- return RADIENT_FAILED (SourceStatus) ? SourceStatus : RADIENT_STATUS_INVALID_OPERATION ;
613- }
592+ auto [pMeshPayload, PayloadCreated] =
593+ MeshCache.GetOrCreate (
594+ CacheKey.c_str (),
595+ [CanUploadMesh]() {
596+ MeshStorage MeshData{CanUploadMesh ? RADIENT_STATUS_PENDING : RADIENT_STATUS_INVALID_OPERATION };
597+ MeshData.GPUResourcesReady .store (false , std::memory_order_release);
598+ return MeshPayloadImpl::Create (MeshAssetStorage{std::move (MeshData)});
599+ });
614600
615- RefCntAutoPtr<MeshAssetImpl> pMeshAsset = CreateCachedMeshAsset (MeshCI.CacheKey , std::move (pCachedMeshPayload));
616- if (!pMeshAsset)
617- return RADIENT_STATUS_INVALID_OPERATION ;
601+ if (!pMeshPayload)
602+ {
603+ pMeshAsset->Fail (RADIENT_STATUS_INVALID_OPERATION );
604+ return ASYNC_TASK_STATUS_COMPLETE ;
605+ }
618606
619- pMeshAsset->QueryInterface (IID_RadientMeshAsset, ppMesh);
620- return RADIENT_STATUS_OK ;
621- }
607+ MeshPayloadImpl* const pMeshPayloadRaw = pMeshPayload.RawPtr ();
608+ pMeshAsset->Resolve (std::move (pMeshPayload));
622609
623- pMeshPayload = CreateMeshPayloadFromCI ();
624- if (!pMeshPayload)
625- {
626- return RADIENT_FAILED (SourceStatus) ? SourceStatus : RADIENT_STATUS_INVALID_OPERATION ;
627- }
610+ if (!PayloadCreated)
611+ return ASYNC_TASK_STATUS_COMPLETE ;
628612
629- RefCntAutoPtr<MeshAssetImpl> pMeshAsset = CreateMeshAsset (m_NextAssetID, std::move (pMeshPayload));
630- if (!pMeshAsset)
631- return RADIENT_STATUS_INVALID_OPERATION ;
613+ if (CanUploadMesh)
614+ LoadMeshFromSource (*pMeshPayloadRaw, std::move (pMeshSource), pDevice, pResourceManager, pUploadManager);
632615
633- pMeshAsset->QueryInterface (IID_RadientMeshAsset, ppMesh);
616+ return ASYNC_TASK_STATUS_COMPLETE ;
617+ });
634618
635- return RADIENT_STATUS_OK ;
619+ return pMeshAsset-> GetResolveStatus () ;
636620}
637621
638622RADIENT_STATUS RadientMeshAssetManager::CreateMeshFromGLTFMesh (IRadientSceneAsset* pModel,
@@ -712,6 +696,10 @@ RADIENT_STATUS RadientMeshAssetManager::GetLoadStatus(IRadientAsset* pMeshAsset)
712696 if (!pMesh)
713697 return RADIENT_STATUS_INVALID_ARGUMENT ;
714698
699+ const RADIENT_STATUS ResolveStatus = pMesh->GetResolveStatus ();
700+ if (ResolveStatus != RADIENT_STATUS_OK )
701+ return ResolveStatus;
702+
715703 const MeshAssetStorage& Storage = pMesh->GetStorage ();
716704 if (const MeshStorage* pMeshStorage = std::get_if<MeshStorage>(&Storage))
717705 return pMeshStorage->LoadStatus .load (std::memory_order_acquire);
0 commit comments