Commit 4cd89381 authored by lukeph's avatar lukeph

small vbo changes, added removeHardwareBuffer(const scene::IMeshBuffer* mb)

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1109 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 2f0855e2
...@@ -199,6 +199,12 @@ namespace video ...@@ -199,6 +199,12 @@ namespace video
materials which are using textures to 0 first. */ materials which are using textures to 0 first. */
virtual void removeAllTextures() = 0; virtual void removeAllTextures() = 0;
//! Remove hardware buffer
virtual void removeHardwareBuffer(const scene::IMeshBuffer* mb) = 0;
//! Remove all hardware buffers
virtual void removeAllHardwareBuffers() = 0;
//! Creates a 1bit alpha channel of the texture based of an color key. //! Creates a 1bit alpha channel of the texture based of an color key.
/** This makes the texture transparent at the regions where this color /** This makes the texture transparent at the regions where this color
key can be found when using for example draw2DImage with useAlphachannel key can be found when using for example draw2DImage with useAlphachannel
......
...@@ -1262,22 +1262,12 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer* ...@@ -1262,22 +1262,12 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer*
if (!isHardwareBufferRecommend(mb)) if (!isHardwareBufferRecommend(mb))
return 0; return 0;
/*
u32 startIndex=0;
for (u32 n=0;n<HWBufferLinks.size();n+=30)
{
if (HWBufferLinks[n]->MeshBuffer < mb)
startIndex=n;
}
*/
//search for hardware links //search for hardware links
for (u32 n=0;n<HWBufferLinks.size();++n) for (u32 n=0;n<HWBufferLinks.size();++n)
{ {
SHWBufferLink *Link=HWBufferLinks[n]; SHWBufferLink *Link=HWBufferLinks[n];
if (Link->MeshBuffer==mb) if (Link->MeshBuffer==mb)
{ {
//((scene::IMeshBuffer*)mb)->HardwareHint=n;
return Link; return Link;
} }
} }
...@@ -1294,27 +1284,45 @@ void CNullDriver::updateAllHardwareBuffers() ...@@ -1294,27 +1284,45 @@ void CNullDriver::updateAllHardwareBuffers()
Link->LastUsed++; Link->LastUsed++;
if (Link->LastUsed>1000) if (Link->LastUsed>20000)
{ {
deleteHardwareBuffer(Link); deleteHardwareBuffer(Link);
delete Link;
HWBufferLinks.erase(n);
} }
} }
} }
//! Remove all hardware buffers
void CNullDriver::removeAllHardwareBuffers() void CNullDriver::deleteHardwareBuffer(SHWBufferLink *HWBuffer)
{
s32 n=HWBufferLinks.binary_search(HWBuffer);
if (n!=-1) HWBufferLinks.erase(n);
delete HWBuffer;
}
//! Remove hardware buffer
void CNullDriver::removeHardwareBuffer(const scene::IMeshBuffer* mb)
{ {
for (u32 n=0;n<HWBufferLinks.size();++n) for (u32 n=0;n<HWBufferLinks.size();++n)
{ {
deleteHardwareBuffer(HWBufferLinks[n]); SHWBufferLink *Link=HWBufferLinks[n];
delete HWBufferLinks[n]; if (Link->MeshBuffer==mb)
{
deleteHardwareBuffer(Link);
}
} }
}
HWBufferLinks.clear();
//! Remove all hardware buffers
void CNullDriver::removeAllHardwareBuffers()
{
while (HWBufferLinks.size())
deleteHardwareBuffer(HWBufferLinks[0]);
} }
bool CNullDriver::isHardwareBufferRecommend(const scene::IMeshBuffer* mb) bool CNullDriver::isHardwareBufferRecommend(const scene::IMeshBuffer* mb)
{ {
if (mb->getHardwareMappingHint()==scene::EHM_NEVER) if (mb->getHardwareMappingHint()==scene::EHM_NEVER)
......
...@@ -324,12 +324,15 @@ namespace video ...@@ -324,12 +324,15 @@ namespace video
//! Draw hardware buffer (only some drivers can) //! Draw hardware buffer (only some drivers can)
virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer) {} virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer) {}
//! Delete hardware buffer (only some drivers can)
virtual void deleteHardwareBuffer(SHWBufferLink *HWBuffer) {}
//! Update all hardware buffers, remove unused ones //! Update all hardware buffers, remove unused ones
virtual void updateAllHardwareBuffers(); virtual void updateAllHardwareBuffers();
//! Delete hardware buffer
virtual void deleteHardwareBuffer(SHWBufferLink *HWBuffer);
//! Remove hardware buffer
virtual void removeHardwareBuffer(const scene::IMeshBuffer* mb);
//! Remove all hardware buffers //! Remove all hardware buffers
virtual void removeAllHardwareBuffers(); virtual void removeAllHardwareBuffers();
......
...@@ -570,6 +570,7 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -570,6 +570,7 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
if (!HWBuffer->vbo_verticesID) if (!HWBuffer->vbo_verticesID)
{ {
extGlGenBuffers(1, &HWBuffer->vbo_verticesID); extGlGenBuffers(1, &HWBuffer->vbo_verticesID);
if (!HWBuffer->vbo_verticesID) return false;
newBuffer=true; newBuffer=true;
} }
...@@ -621,6 +622,7 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -621,6 +622,7 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
if (!HWBuffer->vbo_indicesID) if (!HWBuffer->vbo_indicesID)
{ {
extGlGenBuffers(1, &HWBuffer->vbo_indicesID); extGlGenBuffers(1, &HWBuffer->vbo_indicesID);
if (!HWBuffer->vbo_indicesID) return false;
newBuffer=true; newBuffer=true;
} }
...@@ -710,8 +712,6 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I ...@@ -710,8 +712,6 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
if (!updateHardwareBuffer(HWBuffer)) if (!updateHardwareBuffer(HWBuffer))
{ {
deleteHardwareBuffer(HWBuffer); deleteHardwareBuffer(HWBuffer);
HWBufferLinks.erase(n);
delete HWBuffer;
return 0; return 0;
} }
...@@ -724,6 +724,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I ...@@ -724,6 +724,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer) void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer)
{ {
if (!_HWBuffer) return;
#if defined(GL_ARB_vertex_buffer_object) #if defined(GL_ARB_vertex_buffer_object)
SHWBufferLink_opengl *HWBuffer=(SHWBufferLink_opengl*)_HWBuffer; SHWBufferLink_opengl *HWBuffer=(SHWBufferLink_opengl*)_HWBuffer;
if (HWBuffer->vbo_verticesID) if (HWBuffer->vbo_verticesID)
...@@ -737,6 +739,9 @@ void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer) ...@@ -737,6 +739,9 @@ void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer)
HWBuffer->vbo_indicesID=0; HWBuffer->vbo_indicesID=0;
} }
#endif #endif
CNullDriver::deleteHardwareBuffer(_HWBuffer);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment