@@ -124,11 +124,11 @@ static TextureDesc TexDescFromTexLoadInfo(const TextureLoadInfo& TexLoadInfo, co
124124 return TexDesc;
125125}
126126
127- TextureLoaderImpl::TextureLoaderImpl (IReferenceCounters* pRefCounters,
128- const TextureLoadInfo& TexLoadInfo,
129- const Uint8* pData,
130- size_t DataSize,
131- RefCntAutoPtr<IDataBlob>&& pDataBlob) :
127+ TextureLoaderImpl::TextureLoaderImpl (IReferenceCounters* pRefCounters,
128+ const TextureLoadInfo& TexLoadInfo,
129+ const Uint8* pData,
130+ size_t DataSize,
131+ RefCntAutoPtr<IDataBlob> pDataBlob) :
132132 TBase{pRefCounters},
133133 m_pDataBlob{std::move (pDataBlob)},
134134 m_Name{TexLoadInfo.Name != nullptr ? TexLoadInfo.Name : " " },
@@ -158,8 +158,8 @@ TextureLoaderImpl::TextureLoaderImpl(IReferenceCounters* pRefCounters,
158158 ImgLoadInfo.pAllocator = TexLoadInfo.pAllocator ;
159159 RefCntAutoPtr<Image> pImage;
160160 Image::CreateFromDataBlob (m_pDataBlob, ImgLoadInfo, &pImage);
161- LoadFromImage (pImage, TexLoadInfo);
162161 m_pDataBlob.Release ();
162+ LoadFromImage (std::move (pImage), TexLoadInfo);
163163 }
164164 else
165165 {
@@ -181,12 +181,12 @@ TextureLoaderImpl::TextureLoaderImpl(IReferenceCounters* pRefCounters,
181181
182182TextureLoaderImpl::TextureLoaderImpl (IReferenceCounters* pRefCounters,
183183 const TextureLoadInfo& TexLoadInfo,
184- Image* pImage) :
184+ RefCntAutoPtr< Image> pImage) :
185185 TBase{pRefCounters},
186186 m_Name{TexLoadInfo.Name != nullptr ? TexLoadInfo.Name : " " },
187187 m_TexDesc{TexDescFromTexLoadInfo (TexLoadInfo, m_Name)}
188188{
189- LoadFromImage (pImage, TexLoadInfo);
189+ LoadFromImage (std::move ( pImage) , TexLoadInfo);
190190}
191191
192192void TextureLoaderImpl::CreateTexture (IRenderDevice* pDevice,
@@ -196,7 +196,7 @@ void TextureLoaderImpl::CreateTexture(IRenderDevice* pDevice,
196196 pDevice->CreateTexture (m_TexDesc, &InitData, ppTexture);
197197}
198198
199- void TextureLoaderImpl::LoadFromImage (Image* pImage, const TextureLoadInfo& TexLoadInfo)
199+ void TextureLoaderImpl::LoadFromImage (RefCntAutoPtr< Image> pImage, const TextureLoadInfo& TexLoadInfo)
200200{
201201 VERIFY_EXPR (pImage != nullptr );
202202
@@ -301,12 +301,14 @@ void TextureLoaderImpl::LoadFromImage(Image* pImage, const TextureLoadInfo& TexL
301301 }
302302
303303 CopyPixels (CopyAttribs);
304+ // Release original image
305+ pImage.Release ();
304306 }
305307 else
306308 {
307309 // Keep strong reference to the image to prevent it from being destroyed
308310 // since we are going to use its data directly.
309- m_pImage = pImage;
311+ m_pImage = std::move ( pImage) ;
310312 m_SubResources[0 ].pData = m_pImage->GetData ()->GetConstDataPtr ();
311313 m_SubResources[0 ].Stride = ImgDesc.RowStride ;
312314 }
@@ -352,7 +354,6 @@ void TextureLoaderImpl::LoadFromImage(Image* pImage, const TextureLoadInfo& TexL
352354 if (TexLoadInfo.CompressMode != TEXTURE_LOAD_COMPRESS_MODE_NONE)
353355 {
354356 CompressSubresources (NumComponents, ImgDesc.NumComponents , TexLoadInfo);
355- m_pImage.Release ();
356357 }
357358}
358359
@@ -459,6 +460,12 @@ void TextureLoaderImpl::CompressSubresources(Uint32 NumComponents, Uint32 NumSrc
459460
460461 SubResData.pData = CompressedMip->GetDataPtr ();
461462 SubResData.Stride = CompressedStride;
463+ m_Mips[SubResIndex].Release ();
464+ if (SubResIndex == 0 )
465+ {
466+ VERIFY (!m_pImage || m_TexDesc.GetArraySize () == 1 , " Array textures can't be loaded from an image" );
467+ m_pImage.Release ();
468+ }
462469 }
463470 }
464471
@@ -481,8 +488,8 @@ void CreateTextureLoaderFromFile(const char* FilePath,
481488 RefCntAutoPtr<DataBlobImpl> pFileData = DataBlobImpl::Create (TexLoadInfo.pAllocator );
482489 File->Read (pFileData);
483490
484- RefCntAutoPtr<ITextureLoader > pTexLoader{
485- MakeNewRCObj<TextureLoaderImpl>()(TexLoadInfo, pFileData->GetConstDataPtr <Uint8>(), pFileData->GetSize (), std::move (pFileData)) //
491+ RefCntAutoPtr<TextureLoaderImpl > pTexLoader{
492+ MakeNewRCObj<TextureLoaderImpl>()(TexLoadInfo, pFileData->GetConstDataPtr <Uint8>(), pFileData->GetSize (), std::move (pFileData)),
486493 };
487494 if (pTexLoader)
488495 pTexLoader->QueryInterface (IID_TextureLoader, reinterpret_cast <IObject**>(ppLoader));
@@ -541,7 +548,7 @@ void CreateTextureLoaderFromImage(Image* pSrcImage,
541548 VERIFY_EXPR (pSrcImage != nullptr );
542549 try
543550 {
544- RefCntAutoPtr<ITextureLoader> pTexLoader{MakeNewRCObj<TextureLoaderImpl>()(TexLoadInfo, pSrcImage)};
551+ RefCntAutoPtr<ITextureLoader> pTexLoader{MakeNewRCObj<TextureLoaderImpl>()(TexLoadInfo, RefCntAutoPtr<Image>{ pSrcImage} )};
545552 if (pTexLoader)
546553 pTexLoader->QueryInterface (IID_TextureLoader, reinterpret_cast <IObject**>(ppLoader));
547554 }
0 commit comments