diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index b3a9ce328a8..b74db126985 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -262,6 +262,25 @@ void CGraphics_Threaded::LinesDraw(const CLineItem *pArray, int Num) AddVertices(2 * Num); } +IGraphics::CTextureHandle CGraphics_Threaded::FindFreeTextureIndex() +{ + int Tex = m_FirstFreeTexture; + if(Tex == -1) + { + const size_t CurSize = m_vTextureIndices.size(); + m_vTextureIndices.resize(CurSize * 2); + for(size_t i = 0; i < CurSize - 1; ++i) + { + m_vTextureIndices[CurSize + i] = CurSize + i + 1; + } + m_vTextureIndices.back() = -1; + Tex = CurSize; + } + m_FirstFreeTexture = m_vTextureIndices[Tex]; + m_vTextureIndices[Tex] = -1; + return CreateTextureHandle(Tex); +} + void CGraphics_Threaded::FreeTextureIndex(CTextureHandle *pIndex) { dbg_assert(pIndex->IsValid(), "Cannot free invalid texture index"); @@ -449,25 +468,10 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(size_t Width, size_ if(Width == 0 || Height == 0) return IGraphics::CTextureHandle(); - // grab texture - int Tex = m_FirstFreeTexture; - if(Tex == -1) - { - size_t CurSize = m_vTextureIndices.size(); - m_vTextureIndices.resize(CurSize * 2); - for(size_t i = 0; i < CurSize - 1; ++i) - { - m_vTextureIndices[CurSize + i] = CurSize + i + 1; - } - m_vTextureIndices.back() = -1; - - Tex = CurSize; - } - m_FirstFreeTexture = m_vTextureIndices[Tex]; - m_vTextureIndices[Tex] = -1; + IGraphics::CTextureHandle TextureHandle = FindFreeTextureIndex(); CCommandBuffer::SCommand_Texture_Create Cmd; - Cmd.m_Slot = Tex; + Cmd.m_Slot = TextureHandle.Id(); Cmd.m_Width = Width; Cmd.m_Height = Height; Cmd.m_PixelSize = 4; @@ -501,7 +505,7 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(size_t Width, size_ AddCmd( Cmd, [] { return true; }, "failed to load raw texture."); - return CreateTextureHandle(Tex); + return TextureHandle; } // simple uncompressed RGBA loaders @@ -533,42 +537,12 @@ bool CGraphics_Threaded::LoadTextTextures(size_t Width, size_t Height, CTextureH if(Width == 0 || Height == 0) return false; - // grab texture - int Tex = m_FirstFreeTexture; - if(Tex == -1) - { - size_t CurSize = m_vTextureIndices.size(); - m_vTextureIndices.resize(CurSize * 2); - for(size_t i = 0; i < CurSize - 1; ++i) - { - m_vTextureIndices[CurSize + i] = CurSize + i + 1; - } - m_vTextureIndices.back() = -1; - - Tex = CurSize; - } - m_FirstFreeTexture = m_vTextureIndices[Tex]; - m_vTextureIndices[Tex] = -1; - - int Tex2 = m_FirstFreeTexture; - if(Tex2 == -1) - { - size_t CurSize = m_vTextureIndices.size(); - m_vTextureIndices.resize(CurSize * 2); - for(size_t i = 0; i < CurSize - 1; ++i) - { - m_vTextureIndices[CurSize + i] = CurSize + i + 1; - } - m_vTextureIndices.back() = -1; - - Tex2 = CurSize; - } - m_FirstFreeTexture = m_vTextureIndices[Tex2]; - m_vTextureIndices[Tex2] = -1; + TextTexture = FindFreeTextureIndex(); + TextOutlineTexture = FindFreeTextureIndex(); CCommandBuffer::SCommand_TextTextures_Create Cmd; - Cmd.m_Slot = Tex; - Cmd.m_SlotOutline = Tex2; + Cmd.m_Slot = TextTexture.Id(); + Cmd.m_SlotOutline = TextOutlineTexture.Id(); Cmd.m_Width = Width; Cmd.m_Height = Height; @@ -578,9 +552,6 @@ bool CGraphics_Threaded::LoadTextTextures(size_t Width, size_t Height, CTextureH AddCmd( Cmd, [] { return true; }, "failed to load text textures."); - TextTexture = CreateTextureHandle(Tex); - TextOutlineTexture = CreateTextureHandle(Tex2); - return true; } diff --git a/src/engine/client/graphics_threaded.h b/src/engine/client/graphics_threaded.h index 83fa1f13a50..d6f3b70014b 100644 --- a/src/engine/client/graphics_threaded.h +++ b/src/engine/client/graphics_threaded.h @@ -966,6 +966,7 @@ class CGraphics_Threaded : public IEngineGraphics void LinesEnd() override; void LinesDraw(const CLineItem *pArray, int Num) override; + IGraphics::CTextureHandle FindFreeTextureIndex(); void FreeTextureIndex(CTextureHandle *pIndex); int UnloadTexture(IGraphics::CTextureHandle *pIndex) override; IGraphics::CTextureHandle LoadTextureRaw(size_t Width, size_t Height, int Format, const void *pData, int StoreFormat, int Flags, const char *pTexName = NULL) override;