]> git.lizzy.rs Git - irrlicht.git/commitdiff
Replace HWBufferMap with a list and back pointers (#99)
authorparadust7 <102263465+paradust7@users.noreply.github.com>
Fri, 29 Apr 2022 10:04:22 +0000 (03:04 -0700)
committerGitHub <noreply@github.com>
Fri, 29 Apr 2022 10:04:22 +0000 (12:04 +0200)
include/CMeshBuffer.h
include/IMeshBuffer.h
include/SSkinMeshBuffer.h
source/Irrlicht/CNullDriver.cpp
source/Irrlicht/CNullDriver.h
source/Irrlicht/COGLES2Driver.cpp
source/Irrlicht/COGLESDriver.cpp
source/Irrlicht/COpenGLDriver.cpp

index fe84fb9f706fa883eec8df4c2690841f1cde3f91..6233bbe52dbbf76ee22cecd00823ade20a16be1e 100644 (file)
@@ -21,6 +21,7 @@ namespace scene
                CMeshBuffer()\r
                        : ChangedID_Vertex(1), ChangedID_Index(1)\r
                        , MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)\r
+                       , HWBuffer(NULL)\r
                        , PrimitiveType(EPT_TRIANGLES)\r
                {\r
                        #ifdef _DEBUG\r
@@ -286,12 +287,22 @@ namespace scene
                /** This shouldn't be used for anything outside the VideoDriver. */\r
                virtual u32 getChangedID_Index() const _IRR_OVERRIDE_ {return ChangedID_Index;}\r
 \r
+               virtual void setHWBuffer(void *ptr) const _IRR_OVERRIDE_ {\r
+                       HWBuffer = ptr;\r
+               }\r
+\r
+               virtual void *getHWBuffer() const _IRR_OVERRIDE_ {\r
+                       return HWBuffer;\r
+               }\r
+\r
+\r
                u32 ChangedID_Vertex;\r
                u32 ChangedID_Index;\r
 \r
                //! hardware mapping hint\r
                E_HARDWARE_MAPPING MappingHint_Vertex;\r
                E_HARDWARE_MAPPING MappingHint_Index;\r
+               mutable void *HWBuffer;\r
 \r
                //! Material for this meshbuffer.\r
                video::SMaterial Material;\r
index 488eb029dc949ff2ceab1342c0f871c8265c93bd..a2cd13a46bc66ed7766c80788f2564c7bf7e7c01 100644 (file)
@@ -145,6 +145,10 @@ namespace scene
                /** This shouldn't be used for anything outside the VideoDriver. */\r
                virtual u32 getChangedID_Index() const = 0;\r
 \r
+               //! Used by the VideoDriver to remember the buffer link.\r
+               virtual void setHWBuffer(void *ptr) const = 0;\r
+               virtual void *getHWBuffer() const = 0;\r
+\r
                //! Describe what kind of primitive geometry is used by the meshbuffer\r
                /** Note: Default is EPT_TRIANGLES. Using other types is fine for rendering.\r
                But meshbuffer manipulation functions might expect type EPT_TRIANGLES\r
index a6c2b68dca8cb1c470ea4782899cd12093339bbf..809bd6800dee8fb6efa1e328ea24229e98a5e15d 100644 (file)
@@ -23,6 +23,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
                ChangedID_Vertex(1), ChangedID_Index(1), VertexType(vt),\r
                PrimitiveType(EPT_TRIANGLES),\r
                MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER),\r
+               HWBuffer(NULL),\r
                BoundingBoxNeedsRecalculated(true)\r
        {\r
                #ifdef _DEBUG\r
@@ -383,6 +384,15 @@ struct SSkinMeshBuffer : public IMeshBuffer
 \r
        virtual u32 getChangedID_Index() const _IRR_OVERRIDE_ {return ChangedID_Index;}\r
 \r
+       virtual void setHWBuffer(void *ptr) const _IRR_OVERRIDE_ {\r
+               HWBuffer = ptr;\r
+       }\r
+\r
+       virtual void *getHWBuffer() const _IRR_OVERRIDE_ {\r
+               return HWBuffer;\r
+       }\r
+\r
+\r
        //! Call this after changing the positions of any vertex.\r
        void boundingBoxNeedsRecalculated(void) { BoundingBoxNeedsRecalculated = true; }\r
 \r
@@ -409,6 +419,8 @@ struct SSkinMeshBuffer : public IMeshBuffer
        E_HARDWARE_MAPPING MappingHint_Vertex:3;\r
        E_HARDWARE_MAPPING MappingHint_Index:3;\r
 \r
+       mutable void *HWBuffer;\r
+\r
        bool BoundingBoxNeedsRecalculated:1;\r
 };\r
 \r
index 20ee0938b73e69b3208f7da0ffd0008f7496ae20..98b2bf7746a1d103d2d62ce7c571edd9dc75f0c0 100644 (file)
@@ -1689,9 +1689,9 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer*
                return 0;\r
 \r
        //search for hardware links\r
-       core::map< const scene::IMeshBuffer*,SHWBufferLink* >::Node* node = HWBufferMap.find(mb);\r
-       if (node)\r
-               return node->getValue();\r
+       SHWBufferLink *HWBuffer = reinterpret_cast<SHWBufferLink*>(mb->getHWBuffer());\r
+       if (HWBuffer)\r
+               return HWBuffer;\r
 \r
        return createHardwareBuffer(mb); //no hardware links, and mesh wants one, create it\r
 }\r
@@ -1700,20 +1700,13 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer*
 //! Update all hardware buffers, remove unused ones\r
 void CNullDriver::updateAllHardwareBuffers()\r
 {\r
-       core::map<const scene::IMeshBuffer*,SHWBufferLink*>::ParentFirstIterator Iterator=HWBufferMap.getParentFirstIterator();\r
-\r
-       for (;!Iterator.atEnd();Iterator++)\r
-       {\r
-               SHWBufferLink *Link=Iterator.getNode()->getValue();\r
+       auto it = HWBufferList.begin();\r
+       while (it != HWBufferList.end()) {\r
+               SHWBufferLink *Link = *it;\r
+               ++it;\r
 \r
-               Link->LastUsed++;\r
-               if (Link->LastUsed>20000)\r
-               {\r
+               if (!Link->MeshBuffer || Link->MeshBuffer->getReferenceCount() == 1)\r
                        deleteHardwareBuffer(Link);\r
-\r
-                       // todo: needs better fix\r
-                       Iterator = HWBufferMap.getParentFirstIterator();\r
-               }\r
        }\r
 }\r
 \r
@@ -1722,7 +1715,7 @@ void CNullDriver::deleteHardwareBuffer(SHWBufferLink *HWBuffer)
 {\r
        if (!HWBuffer)\r
                return;\r
-       HWBufferMap.remove(HWBuffer->MeshBuffer);\r
+       HWBufferList.erase(HWBuffer->listPosition);\r
        delete HWBuffer;\r
 }\r
 \r
@@ -1730,17 +1723,19 @@ void CNullDriver::deleteHardwareBuffer(SHWBufferLink *HWBuffer)
 //! Remove hardware buffer\r
 void CNullDriver::removeHardwareBuffer(const scene::IMeshBuffer* mb)\r
 {\r
-       core::map<const scene::IMeshBuffer*,SHWBufferLink*>::Node* node = HWBufferMap.find(mb);\r
-       if (node)\r
-               deleteHardwareBuffer(node->getValue());\r
+       if (!mb)\r
+               return;\r
+       SHWBufferLink *HWBuffer = reinterpret_cast<SHWBufferLink*>(mb->getHWBuffer());\r
+       if (HWBuffer)\r
+               deleteHardwareBuffer(HWBuffer);\r
 }\r
 \r
 \r
 //! Remove all hardware buffers\r
 void CNullDriver::removeAllHardwareBuffers()\r
 {\r
-       while (HWBufferMap.size())\r
-               deleteHardwareBuffer(HWBufferMap.getRoot()->getValue());\r
+       while (!HWBufferList.empty())\r
+               deleteHardwareBuffer(HWBufferList.front());\r
 }\r
 \r
 \r
index e95931f4da327c98516d61acd8430c28fe6e3e2b..c9960f9acf2177fd46315d0574ca13d2e5111894 100644 (file)
@@ -21,6 +21,7 @@
 #include "SVertexIndex.h"\r
 #include "SLight.h"\r
 #include "SExposedVideoData.h"\r
+#include <list>\r
 \r
 namespace irr\r
 {\r
@@ -388,25 +389,29 @@ namespace video
                {\r
                        SHWBufferLink(const scene::IMeshBuffer *_MeshBuffer)\r
                                :MeshBuffer(_MeshBuffer),\r
-                               ChangedID_Vertex(0),ChangedID_Index(0),LastUsed(0),\r
+                               ChangedID_Vertex(0),ChangedID_Index(0),\r
                                Mapped_Vertex(scene::EHM_NEVER),Mapped_Index(scene::EHM_NEVER)\r
                        {\r
-                               if (MeshBuffer)\r
+                               if (MeshBuffer) {\r
                                        MeshBuffer->grab();\r
+                                       MeshBuffer->setHWBuffer(reinterpret_cast<void*>(this));\r
+                               }\r
                        }\r
 \r
                        virtual ~SHWBufferLink()\r
                        {\r
-                               if (MeshBuffer)\r
+                               if (MeshBuffer) {\r
+                                       MeshBuffer->setHWBuffer(NULL);\r
                                        MeshBuffer->drop();\r
+                               }\r
                        }\r
 \r
                        const scene::IMeshBuffer *MeshBuffer;\r
                        u32 ChangedID_Vertex;\r
                        u32 ChangedID_Index;\r
-                       u32 LastUsed;\r
                        scene::E_HARDWARE_MAPPING Mapped_Vertex;\r
                        scene::E_HARDWARE_MAPPING Mapped_Index;\r
+                       std::list<SHWBufferLink*>::iterator listPosition;\r
                };\r
 \r
                //! Gets hardware buffer link from a meshbuffer (may create or update buffer)\r
@@ -818,8 +823,7 @@ namespace video
                core::array<SLight> Lights;\r
                core::array<SMaterialRenderer> MaterialRenderers;\r
 \r
-               //core::array<SHWBufferLink*> HWBufferLinks;\r
-               core::map< const scene::IMeshBuffer* , SHWBufferLink* > HWBufferMap;\r
+               std::list<SHWBufferLink*> HWBufferList;\r
 \r
                io::IFileSystem* FileSystem;\r
 \r
index 87d93c1f3d57a09645783a369333a1b3ad17c37a..14e28c21391cd972ee2c7066da472df5310df1a3 100644 (file)
@@ -589,13 +589,12 @@ COGLES2Driver::~COGLES2Driver()
                SHWBufferLink_opengl *HWBuffer = new SHWBufferLink_opengl(mb);\r
 \r
                //add to map\r
-               HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer);\r
+               HWBuffer->listPosition = HWBufferList.insert(HWBufferList.end(), HWBuffer);\r
 \r
                HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();\r
                HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();\r
                HWBuffer->Mapped_Vertex = mb->getHardwareMappingHint_Vertex();\r
                HWBuffer->Mapped_Index = mb->getHardwareMappingHint_Index();\r
-               HWBuffer->LastUsed = 0;\r
                HWBuffer->vbo_verticesID = 0;\r
                HWBuffer->vbo_indicesID = 0;\r
                HWBuffer->vbo_verticesSize = 0;\r
@@ -642,8 +641,6 @@ COGLES2Driver::~COGLES2Driver()
 \r
                updateHardwareBuffer(HWBuffer); //check if update is needed\r
 \r
-               HWBuffer->LastUsed = 0;//reset count\r
-\r
                const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;\r
                const void *vertices = mb->getVertices();\r
                const void *indexList = mb->getIndices();\r
index 44154023c94ccd93cbae016ffe6e186b507b93a4..a48909e18298d658f1b3d798027082e32b9053ac 100644 (file)
@@ -456,13 +456,12 @@ COGLES1Driver::SHWBufferLink *COGLES1Driver::createHardwareBuffer(const scene::I
        SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb);\r
 \r
        //add to map\r
-       HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer);\r
+       HWBuffer->listPosition = HWBufferList.insert(HWBufferList.end(), HWBuffer);\r
 \r
        HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();\r
        HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index();\r
        HWBuffer->Mapped_Vertex=mb->getHardwareMappingHint_Vertex();\r
        HWBuffer->Mapped_Index=mb->getHardwareMappingHint_Index();\r
-       HWBuffer->LastUsed=0;\r
        HWBuffer->vbo_verticesID=0;\r
        HWBuffer->vbo_indicesID=0;\r
        HWBuffer->vbo_verticesSize=0;\r
@@ -509,8 +508,6 @@ void COGLES1Driver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
 \r
        updateHardwareBuffer(HWBuffer); //check if update is needed\r
 \r
-       HWBuffer->LastUsed=0;//reset count\r
-\r
        const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;\r
        const void *vertices=mb->getVertices();\r
        const void *indexList=mb->getIndices();\r
index bde8ddc84d540a0f89eef222ee68a8e8579d75c6..c03ac3424ab4d47654a05c55f0fb1ca8f120df6a 100644 (file)
@@ -571,13 +571,12 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
        SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb);\r
 \r
        //add to map\r
-       HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer);\r
+       HWBuffer->listPosition = HWBufferList.insert(HWBufferList.end(), HWBuffer);\r
 \r
        HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();\r
        HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index();\r
        HWBuffer->Mapped_Vertex=mb->getHardwareMappingHint_Vertex();\r
        HWBuffer->Mapped_Index=mb->getHardwareMappingHint_Index();\r
-       HWBuffer->LastUsed=0;\r
        HWBuffer->vbo_verticesID=0;\r
        HWBuffer->vbo_indicesID=0;\r
        HWBuffer->vbo_verticesSize=0;\r
@@ -626,7 +625,6 @@ void COpenGLDriver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
                return;\r
 \r
        updateHardwareBuffer(_HWBuffer); //check if update is needed\r
-       _HWBuffer->LastUsed=0; //reset count\r
 \r
 #if defined(GL_ARB_vertex_buffer_object)\r
        SHWBufferLink_opengl *HWBuffer=(SHWBufferLink_opengl*)_HWBuffer;\r