-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
master
lukeph 2008-07-07 05:20:39 +00:00
parent c661079e7e
commit e903f2ca6b
9 changed files with 137 additions and 67 deletions

View File

@ -18,7 +18,7 @@ namespace scene
{
public:
//! 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
setDebugName("SMeshBuffer");
@ -223,12 +223,24 @@ namespace scene
}
//! 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++;
}
//! 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;}
virtual const u32 getChangedID() const {return ChangedID;}
u32 ChangedID;
u32 ChangedID_Vertex;
u32 ChangedID_Index;
//! hardware mapping hint
E_HARDWARE_MAPPING MappingHint;

View File

@ -154,9 +154,17 @@ namespace scene
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) = 0;
//! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0;
virtual const u32 getChangedID() const = 0;
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 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;
};

View File

@ -16,7 +16,7 @@ namespace scene
struct SSharedMeshBuffer : public IMeshBuffer
{
//! constructor
SSharedMeshBuffer() : IMeshBuffer(), ChangedID(1), MappingHint(Never), Vertices(0)
SSharedMeshBuffer() : IMeshBuffer(), ChangedID_Vertex(1), ChangedID_Index(1), MappingHint(Never), Vertices(0)
{
#ifdef _DEBUG
setDebugName("SSharedMeshBuffer");
@ -140,13 +140,30 @@ namespace scene
{
MappingHint=NewMappingHint;
}
//! flags the mesh as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;}
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID() const {return ChangedID;}
//! flags the mesh as changed, reloads hardware buffers
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.
/** This shouldn't be used for anything outside the VideoDriver. */
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
video::SMaterial Material;
@ -158,8 +175,7 @@ namespace scene
core::aabbox3df BoundingBox;
//! hardware mapping hint
E_HARDWARE_MAPPING MappingHint;
//! ID used for hardware buffer management
u32 ChangedID;
};

View File

@ -19,7 +19,7 @@ namespace scene
struct SSkinMeshBuffer : public IMeshBuffer
{
//! 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
setDebugName("SSkinMeshBuffer");
@ -305,14 +305,21 @@ struct SSkinMeshBuffer : public IMeshBuffer
MappingHint=NewMappingHint;
}
//! flags the mesh as changed, reloads hardware buffers
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_Vertex() const {return ChangedID_Vertex;}
virtual const u32 getChangedID_Index() const {return ChangedID_Index;}
u32 ChangedID_Vertex;
u32 ChangedID_Index;
//! flags the mesh as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;}
virtual const u32 getChangedID() const {return ChangedID;}
u32 ChangedID;
// hardware mapping hint
E_HARDWARE_MAPPING MappingHint;

View File

@ -1621,8 +1621,8 @@ void CD3D8Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan
// unset last 3d material
if (CurrentRenderMode == ERM_3D &&
Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
Material.MaterialType >= 0 && LastMaterial.MaterialType < (s32)MaterialRenderers.size())
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
}
if (texture)

View File

@ -208,7 +208,7 @@ bool CD3D9Driver::initDriver(const core::dimension2d<s32>& screenSize, HWND hwnd
{
case 0x1002 : vendorName = "ATI Technologies Inc."; break;
case 0x10DE : vendorName = "NVIDIA Corporation"; break;
case 0x102B : vendorName = "Matrox Electronic Systems Ltd."; break;
case 0x102B : vendorName = "Matrox Electronic Systems Ltd."; break;
case 0x121A : vendorName = "3dfx Interactive Inc"; break;
case 0x5333 : vendorName = "S3 Graphics Co., Ltd."; break;
case 0x8086 : vendorName = "Intel Corporation"; break;
@ -842,28 +842,28 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
// Get the vertex sizes and cvf
switch (vType)
{
case EVT_STANDARD:
vertexSize = sizeof(S3DVertex);
case EVT_STANDARD:
vertexSize = sizeof(S3DVertex);
FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1;
break;
case EVT_2TCOORDS:
vertexSize = sizeof(S3DVertex2TCoords);
case EVT_2TCOORDS:
vertexSize = sizeof(S3DVertex2TCoords);
FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX2;
break;
case EVT_TANGENTS:
case EVT_TANGENTS:
vertexSize = sizeof(S3DVertexTangents);
FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX3;
FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX3;
break;
default:
default:
return false;
}
}
flags = D3DUSAGE_WRITEONLY; // SIO2: Default to D3DUSAGE_WRITEONLY
if(HWBuffer->Mapped != scene::EHM_STATIC)
flags |= D3DUSAGE_DYNAMIC;
pID3DDevice->CreateVertexBuffer(vertexCount * vertexSize, flags, FVF, D3DPOOL_DEFAULT, &HWBuffer->vertexBuffer, NULL);
if(!HWBuffer->vertexBuffer)
return false;
@ -878,7 +878,7 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
HWBuffer->vertexBufferSize = vertexCount * vertexSize;
}
else
{
{
HWBuffer->vertexBuffer->Lock(0, vertexCount * vertexSize, (void**)&pLockedBuffer, D3DLOCK_DISCARD);
memcpy(pLockedBuffer, vertices, vertexCount * vertexSize);
HWBuffer->vertexBuffer->Unlock();
@ -944,17 +944,30 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
if (!HWBuffer)
return false;
if (HWBuffer->ChangedID != HWBuffer->MeshBuffer->getChangedID()
|| !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer
|| !((SHWBufferLink_d3d9*)HWBuffer)->indexBuffer)
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|| !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer)
{
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID();
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
if (!updateVertexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
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))
return false;
}
return true;
}
@ -970,7 +983,8 @@ CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMesh
//add to map
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->LastUsed=0;
HWBuffer->vertexBuffer=0;
@ -1108,7 +1122,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
u16 tmpIndices[] = {0, primitiveCount};
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount,
@ -1154,7 +1168,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
pID3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, vertexCount, 0, primitiveCount);
}
else
{
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
}
@ -1870,8 +1884,8 @@ void CD3D9Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan
// unset last 3d material
if (CurrentRenderMode != ERM_2D)
{
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
if (static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
setBasicRenderStates(SMaterial(), SMaterial(), true);
// everything that is wrongly set by SMaterial default
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);

View File

@ -299,7 +299,7 @@ namespace video
protected:
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)
MeshBuffer->grab();
@ -313,7 +313,8 @@ namespace video
scene::E_BUFFER_TYPE Contains;
const scene::IMeshBuffer *MeshBuffer;
u32 ChangedID;
u32 ChangedID_Vertex;
u32 ChangedID_Index;
u32 LastUsed;
scene::E_HARDWARE_MAPPING Mapped;

View File

@ -713,19 +713,30 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
{
if (!HWBuffer)
return false;
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
{
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
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))
return false;
}
if (HWBuffer->ChangedID != HWBuffer->MeshBuffer->getChangedID()
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
{
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID();
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false;
if (!updateIndexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false;
}
return true;
}
@ -743,7 +754,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
//add to map
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->LastUsed=0;
HWBuffer->vbo_verticesID=0;
@ -1880,8 +1892,8 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
// unset last 3d material
if (CurrentRenderMode == ERM_3D)
{
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
if (static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
SMaterial mat;
mat.ZBuffer=0;
mat.Lighting=false;

View File

@ -458,7 +458,7 @@ void CSkinnedMesh::skinMesh()
SkinJoint(RootJoints[i], 0);
for (i=0; i<SkinningBuffers->size(); ++i)
(*SkinningBuffers)[i]->setDirty();
(*SkinningBuffers)[i]->setDirty(EBT_VERTEX);
}
}