Resource leak fixes
This was SVN commit r1513.
This commit is contained in:
parent
da4c42ef58
commit
b534e640ca
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include "boost/shared_ptr.hpp"
|
#include "boost/shared_ptr.hpp"
|
||||||
#include "boost/weak_ptr.hpp"
|
#include "boost/weak_ptr.hpp"
|
||||||
//
|
|
||||||
#define g_MeshManager CMeshManager::GetSingleton()
|
#define g_MeshManager CMeshManager::GetSingleton()
|
||||||
|
|
||||||
class CModelDef;
|
class CModelDef;
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "SkeletonAnimDef.h"
|
#include "SkeletonAnimDef.h"
|
||||||
#include "SkeletonAnimManager.h"
|
#include "SkeletonAnimManager.h"
|
||||||
#include "MeshManager.h"
|
#include "MeshManager.h"
|
||||||
|
#include "lib/res/ogl_tex.h"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Constructor
|
// Constructor
|
||||||
@ -43,6 +44,10 @@ void CModel::ReleaseData()
|
|||||||
}
|
}
|
||||||
m_Props.clear();
|
m_Props.clear();
|
||||||
m_pModelDef = CModelDefPtr();
|
m_pModelDef = CModelDefPtr();
|
||||||
|
|
||||||
|
Handle h = m_Texture.GetHandle();
|
||||||
|
tex_free(h);
|
||||||
|
m_Texture.SetHandle(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -10,11 +10,19 @@
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
// CTextureEntry constructor
|
// CTextureEntry constructor
|
||||||
CTextureEntry::CTextureEntry(const char* name,int type)
|
CTextureEntry::CTextureEntry(const char* name,int type)
|
||||||
: m_Name(name), m_Bitmap(0), m_Handle(0xffffffff), m_BaseColor(0), m_Type(type), m_BaseColorValid(false)
|
: m_Name(name), m_Bitmap(0), m_Handle(-1), m_BaseColor(0), m_Type(type), m_BaseColorValid(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// CTextureEntry destructor
|
||||||
|
CTextureEntry::~CTextureEntry()
|
||||||
|
{
|
||||||
|
if (m_Handle > 0)
|
||||||
|
tex_free(m_Handle);
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////
|
||||||
// LoadTexture: actually load the texture resource from file
|
// LoadTexture: actually load the texture resource from file
|
||||||
void CTextureEntry::LoadTexture()
|
void CTextureEntry::LoadTexture()
|
||||||
|
@ -11,6 +11,7 @@ class CTextureEntry
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CTextureEntry(const char* name,int type);
|
CTextureEntry(const char* name,int type);
|
||||||
|
~CTextureEntry();
|
||||||
|
|
||||||
// accessor - return texture name
|
// accessor - return texture name
|
||||||
const char* GetName() const { return (const char*) m_Name; }
|
const char* GetName() const { return (const char*) m_Name; }
|
||||||
@ -22,7 +23,7 @@ public:
|
|||||||
|
|
||||||
// accessor - get texture handle
|
// accessor - get texture handle
|
||||||
Handle GetHandle() {
|
Handle GetHandle() {
|
||||||
if (m_Handle==0xffffffff) LoadTexture();
|
if (m_Handle==-1) LoadTexture();
|
||||||
return m_Handle;
|
return m_Handle;
|
||||||
}
|
}
|
||||||
// accessor - get mipmap color
|
// accessor - get mipmap color
|
||||||
|
@ -3,10 +3,45 @@
|
|||||||
#include "GUIRenderer.h"
|
#include "GUIRenderer.h"
|
||||||
|
|
||||||
#include "lib/ogl.h"
|
#include "lib/ogl.h"
|
||||||
|
#include "lib/res/h_mgr.h"
|
||||||
|
|
||||||
#include "ps/CLogger.h"
|
#include "ps/CLogger.h"
|
||||||
#define LOG_CATEGORY "gui"
|
#define LOG_CATEGORY "gui"
|
||||||
|
|
||||||
|
using namespace GUIRenderer;
|
||||||
|
|
||||||
|
// Copyable texture Handle, for use in STL containers where the Handle should
|
||||||
|
// be freed when it's finished with.
|
||||||
|
|
||||||
|
Handle_rfcnt_tex::Handle_rfcnt_tex()
|
||||||
|
: h(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle_rfcnt_tex::Handle_rfcnt_tex(Handle h_)
|
||||||
|
: h(h_)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle_rfcnt_tex::Handle_rfcnt_tex(const Handle_rfcnt_tex& that)
|
||||||
|
{
|
||||||
|
h = that.h;
|
||||||
|
if (h) h_add_ref(h);
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle_rfcnt_tex::~Handle_rfcnt_tex()
|
||||||
|
{
|
||||||
|
if (h) tex_free(h);
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle_rfcnt_tex& Handle_rfcnt_tex::operator=(Handle h_)
|
||||||
|
{
|
||||||
|
h = h_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Functions to perform drawing-related actions:
|
||||||
|
|
||||||
void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, CStr &SpriteName, CRect &Size, std::map<CStr, CGUISprite> &Sprites)
|
void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, CStr &SpriteName, CRect &Size, std::map<CStr, CGUISprite> &Sprites)
|
||||||
{
|
{
|
||||||
Calls.clear();
|
Calls.clear();
|
||||||
@ -42,17 +77,17 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls &Calls, CStr &SpriteName, CRect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Call.m_TexHandle = h;
|
int err = tex_upload(h);
|
||||||
|
|
||||||
int err = tex_upload(Call.m_TexHandle);
|
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
{
|
{
|
||||||
LOG(ERROR, LOG_CATEGORY, "Error uploading texture '%s': %d", (const char*)cit->m_TextureName, err);
|
LOG(ERROR, LOG_CATEGORY, "Error uploading texture '%s': %d", (const char*)cit->m_TextureName, err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Call.m_TexHandle = h;
|
||||||
|
|
||||||
int fmt, t_w, t_h;
|
int fmt, t_w, t_h;
|
||||||
tex_info(Call.m_TexHandle, &t_w, &t_h, &fmt, NULL, NULL);
|
tex_info(h, &t_w, &t_h, &fmt, NULL, NULL);
|
||||||
Call.m_EnableBlending = (fmt == GL_RGBA || fmt == GL_BGRA);
|
Call.m_EnableBlending = (fmt == GL_RGBA || fmt == GL_BGRA);
|
||||||
|
|
||||||
CRect real = cit->m_Size.GetClientArea(Size);
|
CRect real = cit->m_Size.GetClientArea(Size);
|
||||||
@ -121,14 +156,14 @@ void GUIRenderer::Draw(DrawCalls &Calls)
|
|||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cit->m_TexHandle)
|
if (cit->m_TexHandle.h)
|
||||||
{
|
{
|
||||||
// TODO: Handle the GL state in a nicer way
|
// TODO: Handle the GL state in a nicer way
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||||
|
|
||||||
tex_bind(cit->m_TexHandle);
|
tex_bind(cit->m_TexHandle.h);
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
|
|
||||||
|
@ -8,9 +8,19 @@
|
|||||||
|
|
||||||
namespace GUIRenderer
|
namespace GUIRenderer
|
||||||
{
|
{
|
||||||
|
struct Handle_rfcnt_tex
|
||||||
|
{
|
||||||
|
Handle h;
|
||||||
|
Handle_rfcnt_tex();
|
||||||
|
Handle_rfcnt_tex(Handle h_);
|
||||||
|
Handle_rfcnt_tex(const Handle_rfcnt_tex& that);
|
||||||
|
~Handle_rfcnt_tex();
|
||||||
|
Handle_rfcnt_tex& operator=(Handle h_);
|
||||||
|
};
|
||||||
|
|
||||||
struct SDrawCall
|
struct SDrawCall
|
||||||
{
|
{
|
||||||
Handle m_TexHandle;
|
Handle_rfcnt_tex m_TexHandle;
|
||||||
|
|
||||||
bool m_EnableBlending;
|
bool m_EnableBlending;
|
||||||
|
|
||||||
|
@ -995,25 +995,17 @@ void CRenderer::Submit(COverlay* overlay)
|
|||||||
void CRenderer::RenderPatchSubmissions()
|
void CRenderer::RenderPatchSubmissions()
|
||||||
{
|
{
|
||||||
// switch on required client states
|
// switch on required client states
|
||||||
MICROLOG(L"enable vertex array");
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
MICROLOG(L"enable color array");
|
|
||||||
glEnableClientState(GL_COLOR_ARRAY);
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
MICROLOG(L"enable tex coord array");
|
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
|
||||||
// render everything
|
// render everything
|
||||||
MICROLOG(L"render base splats");
|
|
||||||
CPatchRData::RenderBaseSplats();
|
CPatchRData::RenderBaseSplats();
|
||||||
MICROLOG(L"render blend splats");
|
|
||||||
CPatchRData::RenderBlendSplats();
|
CPatchRData::RenderBlendSplats();
|
||||||
|
|
||||||
// switch off all client states
|
// switch off all client states
|
||||||
MICROLOG(L"disable tex coord array");
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
MICROLOG(L"disable color array");
|
|
||||||
glDisableClientState(GL_COLOR_ARRAY);
|
glDisableClientState(GL_COLOR_ARRAY);
|
||||||
MICROLOG(L"disable vertex array");
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1023,16 +1015,18 @@ void CRenderer::RenderPatchSubmissions()
|
|||||||
// LoadTexture: try and load the given texture; set clamp/repeat flags on texture object if necessary
|
// LoadTexture: try and load the given texture; set clamp/repeat flags on texture object if necessary
|
||||||
bool CRenderer::LoadTexture(CTexture* texture,u32 wrapflags)
|
bool CRenderer::LoadTexture(CTexture* texture,u32 wrapflags)
|
||||||
{
|
{
|
||||||
|
const Handle errorhandle = -1;
|
||||||
|
|
||||||
Handle h=texture->GetHandle();
|
Handle h=texture->GetHandle();
|
||||||
if (h) {
|
if (h) {
|
||||||
// already tried to load this texture, nothing to do here - just return success according
|
// already tried to load this texture, nothing to do here - just return success according
|
||||||
// to whether this is a valid handle or not
|
// to whether this is a valid handle or not
|
||||||
return h==0xffffffff ? true : false;
|
return h==errorhandle ? true : false;
|
||||||
} else {
|
} else {
|
||||||
h=tex_load(texture->GetName());
|
h=tex_load(texture->GetName());
|
||||||
if (h <= 0) {
|
if (h <= 0) {
|
||||||
LOG(ERROR, LOG_CATEGORY, "LoadTexture failed on \"%s\"",(const char*) texture->GetName());
|
LOG(ERROR, LOG_CATEGORY, "LoadTexture failed on \"%s\"",(const char*) texture->GetName());
|
||||||
texture->SetHandle(0xffffffff);
|
texture->SetHandle(errorhandle);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
int tw,th;
|
int tw,th;
|
||||||
@ -1041,8 +1035,9 @@ bool CRenderer::LoadTexture(CTexture* texture,u32 wrapflags)
|
|||||||
tw&=(tw-1);
|
tw&=(tw-1);
|
||||||
th&=(th-1);
|
th&=(th-1);
|
||||||
if (tw || th) {
|
if (tw || th) {
|
||||||
texture->SetHandle(0xffffffff);
|
|
||||||
LOG(ERROR, LOG_CATEGORY, "LoadTexture failed on \"%s\" : not a power of 2 texture",(const char*) texture->GetName());
|
LOG(ERROR, LOG_CATEGORY, "LoadTexture failed on \"%s\" : not a power of 2 texture",(const char*) texture->GetName());
|
||||||
|
tex_free(h);
|
||||||
|
texture->SetHandle(errorhandle);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
BindTexture(0,tex_id(h));
|
BindTexture(0,tex_id(h));
|
||||||
|
Loading…
Reference in New Issue
Block a user