Skip to content

Commit 06da4cd

Browse files
Texture Loader: memory usage improvements
1 parent 598fc8a commit 06da4cd

File tree

3 files changed

+35
-28
lines changed

3 files changed

+35
-28
lines changed

TextureLoader/include/TextureLoaderImpl.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ class TextureLoaderImpl final : public ObjectBase<ITextureLoader>
3939
public:
4040
using TBase = ObjectBase<ITextureLoader>;
4141

42-
TextureLoaderImpl(IReferenceCounters* pRefCounters,
43-
const TextureLoadInfo& TexLoadInfo,
44-
const Uint8* pData,
45-
size_t DataSize,
46-
RefCntAutoPtr<IDataBlob>&& pDataBlob);
42+
TextureLoaderImpl(IReferenceCounters* pRefCounters,
43+
const TextureLoadInfo& TexLoadInfo,
44+
const Uint8* pData,
45+
size_t DataSize,
46+
RefCntAutoPtr<IDataBlob> pDataBlob);
4747

4848
TextureLoaderImpl(IReferenceCounters* pRefCounters,
4949
const TextureLoadInfo& TexLoadInfo,
50-
Image* pImage);
50+
RefCntAutoPtr<Image> pImage);
5151

5252
IMPLEMENT_QUERY_INTERFACE_IN_PLACE(IID_TextureLoader, TBase)
5353

@@ -73,7 +73,7 @@ class TextureLoaderImpl final : public ObjectBase<ITextureLoader>
7373
}
7474

7575
private:
76-
void LoadFromImage(Image* pImage, const TextureLoadInfo& TexLoadInfo);
76+
void LoadFromImage(RefCntAutoPtr<Image> pImage, const TextureLoadInfo& TexLoadInfo);
7777
void LoadFromKTX(const TextureLoadInfo& TexLoadInfo, const Uint8* pData, size_t DataSize);
7878
void LoadFromDDS(const TextureLoadInfo& TexLoadInfo, const Uint8* pData, size_t DataSize);
7979
void CompressSubresources(Uint32 NumComponents, Uint32 NumSrcComponents, const TextureLoadInfo& TexLoadInfo);

TextureLoader/src/Image.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -339,31 +339,31 @@ Image::Image(IReferenceCounters* pRefCounters,
339339
}
340340
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_HDR)
341341
{
342-
bool Res = LoadHDRFile(pFileData, m_pData.RawPtr(), &m_Desc);
342+
bool Res = LoadHDRFile(pFileData, m_pData, &m_Desc);
343343
if (!Res)
344344
LOG_ERROR_MESSAGE("Failed to load HDR image");
345345
}
346346
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_TGA)
347347
{
348-
bool Res = LoadTGAFile(pFileData, m_pData.RawPtr(), &m_Desc);
348+
bool Res = LoadTGAFile(pFileData, m_pData, &m_Desc);
349349
if (!Res)
350350
LOG_ERROR_MESSAGE("Failed to load TGA image");
351351
}
352352
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_PNG)
353353
{
354-
auto Res = DecodePng(pFileData, m_pData.RawPtr(), &m_Desc);
354+
auto Res = DecodePng(pFileData, m_pData, &m_Desc);
355355
if (Res != DECODE_PNG_RESULT_OK)
356356
LOG_ERROR_MESSAGE("Failed to decode png image");
357357
}
358358
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_JPEG)
359359
{
360-
auto Res = DecodeJpeg(pFileData, m_pData.RawPtr(), &m_Desc);
360+
auto Res = DecodeJpeg(pFileData, m_pData, &m_Desc);
361361
if (Res != DECODE_JPEG_RESULT_OK)
362362
LOG_ERROR_MESSAGE("Failed to decode jpeg image");
363363
}
364364
else if (LoadInfo.Format == IMAGE_FILE_FORMAT_SGI)
365365
{
366-
auto Res = LoadSGI(pFileData, m_pData.RawPtr(), &m_Desc);
366+
auto Res = LoadSGI(pFileData, m_pData, &m_Desc);
367367
if (!Res)
368368
LOG_ERROR_MESSAGE("Failed to load SGI image");
369369
}
@@ -481,7 +481,7 @@ void Image::Encode(const EncodeInfo& Info, IDataBlob** ppEncodedData)
481481
{
482482
auto RGBData = ConvertImageData(Info.Width, Info.Height, reinterpret_cast<const Uint8*>(Info.pData), Info.Stride, Info.TexFormat, TEX_FORMAT_RGBA8_UNORM, false, Info.FlipY);
483483

484-
auto Res = EncodeJpeg(RGBData.data(), Info.Width, Info.Height, Info.JpegQuality, pEncodedData.RawPtr());
484+
auto Res = EncodeJpeg(RGBData.data(), Info.Width, Info.Height, Info.JpegQuality, pEncodedData);
485485
if (Res != ENCODE_JPEG_RESULT_OK)
486486
LOG_ERROR_MESSAGE("Failed to encode jpeg file");
487487
}
@@ -497,7 +497,7 @@ void Image::Encode(const EncodeInfo& Info, IDataBlob** ppEncodedData)
497497
Stride = Info.Width * (Info.KeepAlpha ? 4 : 3);
498498
}
499499

500-
auto Res = EncodePng(pData, Info.Width, Info.Height, Stride, Info.KeepAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB, pEncodedData.RawPtr());
500+
auto Res = EncodePng(pData, Info.Width, Info.Height, Stride, Info.KeepAlpha ? PNG_COLOR_TYPE_RGBA : PNG_COLOR_TYPE_RGB, pEncodedData);
501501
if (Res != ENCODE_PNG_RESULT_OK)
502502
LOG_ERROR_MESSAGE("Failed to encode png file");
503503
}

TextureLoader/src/TextureLoaderImpl.cpp

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

182182
TextureLoaderImpl::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

192192
void 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

Comments
 (0)