Commit e903f2ca authored by lukeph's avatar lukeph

-Made drivers update vertex and index VBOs independently. Massive speed up for...

-Made drivers update vertex and index VBOs independently. Massive speed up for terrain nodes. Interface isn’t so clean yet, but will be when vertex and index buffers are separated.

-fixed a rendering state bug, in openGL and directx drivers, while changing from 3d to 2d rendering.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1403 dfc29bdd-3216-0410-991c-e03cc46cb475
parent c661079e
...@@ -18,7 +18,7 @@ namespace scene ...@@ -18,7 +18,7 @@ namespace scene
{ {
public: public:
//! Default constructor for empty meshbuffer //! Default constructor for empty meshbuffer
CMeshBuffer():ChangedID(1),MappingHint(EHM_NEVER) // everything's default constructed CMeshBuffer():ChangedID_Vertex(1),ChangedID_Index(1),MappingHint(EHM_NEVER) // everything's default constructed
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("SMeshBuffer"); setDebugName("SMeshBuffer");
...@@ -223,12 +223,24 @@ namespace scene ...@@ -223,12 +223,24 @@ namespace scene
} }
//! flags the mesh as changed, reloads hardware buffers //! flags the mesh as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;} virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
{
if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
ChangedID_Vertex++;
else if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
ChangedID_Index++;
}
virtual const u32 getChangedID() const {return ChangedID;} //! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID_Index() const {return ChangedID_Index;}
u32 ChangedID; u32 ChangedID_Vertex;
u32 ChangedID_Index;
//! hardware mapping hint //! hardware mapping hint
E_HARDWARE_MAPPING MappingHint; E_HARDWARE_MAPPING MappingHint;
......
...@@ -156,7 +156,15 @@ namespace scene ...@@ -156,7 +156,15 @@ namespace scene
//! flags the meshbuffer as changed, reloads hardware buffers //! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0; virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0;
virtual const u32 getChangedID() const = 0; //to be spit into vertex and index buffers:
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID_Vertex() const = 0;
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID_Index() const = 0;
u32 HardwareHint; u32 HardwareHint;
}; };
......
...@@ -16,7 +16,7 @@ namespace scene ...@@ -16,7 +16,7 @@ namespace scene
struct SSharedMeshBuffer : public IMeshBuffer struct SSharedMeshBuffer : public IMeshBuffer
{ {
//! constructor //! constructor
SSharedMeshBuffer() : IMeshBuffer(), ChangedID(1), MappingHint(Never), Vertices(0) SSharedMeshBuffer() : IMeshBuffer(), ChangedID_Vertex(1), ChangedID_Index(1), MappingHint(Never), Vertices(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("SSharedMeshBuffer"); setDebugName("SSharedMeshBuffer");
...@@ -141,12 +141,29 @@ namespace scene ...@@ -141,12 +141,29 @@ namespace scene
MappingHint=NewMappingHint; MappingHint=NewMappingHint;
} }
//! flags the mesh as changed, reloads hardware buffers //! flags the mesh as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;} virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
{
if (E_BUFFER_TYPE Buffer==EBT_VERTEX_AND_INDEX || E_BUFFER_TYPE Buffer==EBT_VERTEX)
ChangedID_Vertex++;
else if (E_BUFFER_TYPE Buffer==EBT_VERTEX_AND_INDEX || E_BUFFER_TYPE Buffer==EBT_INDEX)
ChangedID_Index++;
}
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
//! Get the currently used ID for identification of changes. //! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ /** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID() const {return ChangedID;} virtual const u32 getChangedID_Index() const {return ChangedID_Index;}
//! ID used for hardware buffer management
u32 ChangedID_Vertex;
//! ID used for hardware buffer management
u32 ChangedID_Index;
//! Material of this meshBuffer //! Material of this meshBuffer
video::SMaterial Material; video::SMaterial Material;
...@@ -158,8 +175,7 @@ namespace scene ...@@ -158,8 +175,7 @@ namespace scene
core::aabbox3df BoundingBox; core::aabbox3df BoundingBox;
//! hardware mapping hint //! hardware mapping hint
E_HARDWARE_MAPPING MappingHint; E_HARDWARE_MAPPING MappingHint;
//! ID used for hardware buffer management
u32 ChangedID;
}; };
......
...@@ -19,7 +19,7 @@ namespace scene ...@@ -19,7 +19,7 @@ namespace scene
struct SSkinMeshBuffer : public IMeshBuffer struct SSkinMeshBuffer : public IMeshBuffer
{ {
//! Default constructor //! Default constructor
SSkinMeshBuffer(video::E_VERTEX_TYPE vt=video::EVT_STANDARD) : ChangedID(1),MappingHint(EHM_NEVER),VertexType(vt) SSkinMeshBuffer(video::E_VERTEX_TYPE vt=video::EVT_STANDARD) : ChangedID_Vertex(1),ChangedID_Index(1),MappingHint(EHM_NEVER),VertexType(vt)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("SSkinMeshBuffer"); setDebugName("SSkinMeshBuffer");
...@@ -305,14 +305,21 @@ struct SSkinMeshBuffer : public IMeshBuffer ...@@ -305,14 +305,21 @@ struct SSkinMeshBuffer : public IMeshBuffer
MappingHint=NewMappingHint; MappingHint=NewMappingHint;
} }
//! flags the mesh as changed, reloads hardware buffers //! flags the mesh as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;} virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
{
if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
ChangedID_Vertex++;
else if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
ChangedID_Index++;
}
virtual const u32 getChangedID() const {return ChangedID;} virtual const u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
virtual const u32 getChangedID_Index() const {return ChangedID_Index;}
u32 ChangedID_Vertex;
u32 ChangedID_Index;
u32 ChangedID;
// hardware mapping hint // hardware mapping hint
E_HARDWARE_MAPPING MappingHint; E_HARDWARE_MAPPING MappingHint;
......
...@@ -1621,8 +1621,8 @@ void CD3D8Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan ...@@ -1621,8 +1621,8 @@ void CD3D8Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan
// unset last 3d material // unset last 3d material
if (CurrentRenderMode == ERM_3D && if (CurrentRenderMode == ERM_3D &&
Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size()) Material.MaterialType >= 0 && LastMaterial.MaterialType < (s32)MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial(); MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
} }
if (texture) if (texture)
......
...@@ -944,17 +944,30 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer) ...@@ -944,17 +944,30 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
if (!HWBuffer) if (!HWBuffer)
return false; return false;
if (HWBuffer->ChangedID != HWBuffer->MeshBuffer->getChangedID() if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|| !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer || !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer)
|| !((SHWBufferLink_d3d9*)HWBuffer)->indexBuffer)
{ {
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID();
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
if (!updateVertexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer)) if (!updateVertexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
return false; return false;
}
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|| !((SHWBufferLink_d3d9*)HWBuffer)->indexBuffer)
{
HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();
if (!updateIndexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer)) if (!updateIndexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
return false; return false;
} }
return true; return true;
} }
...@@ -970,7 +983,8 @@ CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMesh ...@@ -970,7 +983,8 @@ CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMesh
//add to map //add to map
HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer); HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer);
HWBuffer->ChangedID=HWBuffer->MeshBuffer->getChangedID(); HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();
HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index();
HWBuffer->Mapped=mb->getHardwareMappingHint(); HWBuffer->Mapped=mb->getHardwareMappingHint();
HWBuffer->LastUsed=0; HWBuffer->LastUsed=0;
HWBuffer->vertexBuffer=0; HWBuffer->vertexBuffer=0;
...@@ -1870,8 +1884,8 @@ void CD3D9Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan ...@@ -1870,8 +1884,8 @@ void CD3D9Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan
// unset last 3d material // unset last 3d material
if (CurrentRenderMode != ERM_2D) if (CurrentRenderMode != ERM_2D)
{ {
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size()) if (static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial(); MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
setBasicRenderStates(SMaterial(), SMaterial(), true); setBasicRenderStates(SMaterial(), SMaterial(), true);
// everything that is wrongly set by SMaterial default // everything that is wrongly set by SMaterial default
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE); pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
......
...@@ -299,7 +299,7 @@ namespace video ...@@ -299,7 +299,7 @@ namespace video
protected: protected:
struct SHWBufferLink struct SHWBufferLink
{ {
SHWBufferLink(const scene::IMeshBuffer *_MeshBuffer):MeshBuffer(_MeshBuffer),ChangedID(0),LastUsed(0),Mapped(scene::EHM_NEVER) SHWBufferLink(const scene::IMeshBuffer *_MeshBuffer):MeshBuffer(_MeshBuffer),ChangedID_Vertex(0),ChangedID_Index(0),LastUsed(0),Mapped(scene::EHM_NEVER)
{ {
if (MeshBuffer) if (MeshBuffer)
MeshBuffer->grab(); MeshBuffer->grab();
...@@ -313,7 +313,8 @@ namespace video ...@@ -313,7 +313,8 @@ namespace video
scene::E_BUFFER_TYPE Contains; scene::E_BUFFER_TYPE Contains;
const scene::IMeshBuffer *MeshBuffer; const scene::IMeshBuffer *MeshBuffer;
u32 ChangedID; u32 ChangedID_Vertex;
u32 ChangedID_Index;
u32 LastUsed; u32 LastUsed;
scene::E_HARDWARE_MAPPING Mapped; scene::E_HARDWARE_MAPPING Mapped;
......
...@@ -714,18 +714,29 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer) ...@@ -714,18 +714,29 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
if (!HWBuffer) if (!HWBuffer)
return false; return false;
if (HWBuffer->ChangedID != HWBuffer->MeshBuffer->getChangedID() if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID) || !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
{ {
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID(); HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer)) if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false; return false;
}
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID)
{
HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();
if (!updateIndexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer)) if (!updateIndexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false; return false;
} }
return true; return true;
} }
...@@ -743,7 +754,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I ...@@ -743,7 +754,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
//add to map //add to map
HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer); HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer);
HWBuffer->ChangedID=HWBuffer->MeshBuffer->getChangedID(); HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();
HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index();
HWBuffer->Mapped=mb->getHardwareMappingHint(); HWBuffer->Mapped=mb->getHardwareMappingHint();
HWBuffer->LastUsed=0; HWBuffer->LastUsed=0;
HWBuffer->vbo_verticesID=0; HWBuffer->vbo_verticesID=0;
...@@ -1880,8 +1892,8 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh ...@@ -1880,8 +1892,8 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
// unset last 3d material // unset last 3d material
if (CurrentRenderMode == ERM_3D) if (CurrentRenderMode == ERM_3D)
{ {
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size()) if (static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial(); MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
SMaterial mat; SMaterial mat;
mat.ZBuffer=0; mat.ZBuffer=0;
mat.Lighting=false; mat.Lighting=false;
......
...@@ -458,7 +458,7 @@ void CSkinnedMesh::skinMesh() ...@@ -458,7 +458,7 @@ void CSkinnedMesh::skinMesh()
SkinJoint(RootJoints[i], 0); SkinJoint(RootJoints[i], 0);
for (i=0; i<SkinningBuffers->size(); ++i) for (i=0; i<SkinningBuffers->size(); ++i)
(*SkinningBuffers)[i]->setDirty(); (*SkinningBuffers)[i]->setDirty(EBT_VERTEX);
} }
} }
......
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