OgreHardwareBufferManager.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004     (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 
00009 Permission is hereby granted, free of charge, to any person obtaining a copy
00010 of this software and associated documentation files (the "Software"), to deal
00011 in the Software without restriction, including without limitation the rights
00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00013 copies of the Software, and to permit persons to whom the Software is
00014 furnished to do so, subject to the following conditions:
00015 
00016 The above copyright notice and this permission notice shall be included in
00017 all copies or substantial portions of the Software.
00018 
00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00025 THE SOFTWARE.
00026 -----------------------------------------------------------------------------
00027 */
00028 #ifndef __HardwareBufferManager__
00029 #define __HardwareBufferManager__
00030 
00031 // Precompiler options
00032 #include "OgrePrerequisites.h"
00033 
00034 #include "OgreSingleton.h"
00035 #include "OgreHardwareVertexBuffer.h"
00036 #include "OgreHardwareIndexBuffer.h"
00037 #include "OgreRenderToVertexBuffer.h"
00038 
00039 namespace Ogre {
00057     class _OgreExport HardwareBufferLicensee
00058     {
00059     public:
00060         virtual ~HardwareBufferLicensee() { }
00063         virtual void licenseExpired(HardwareBuffer* buffer) = 0;
00064     };
00065 
00067     class _OgreExport TempBlendedBufferInfo : public HardwareBufferLicensee, public BufferAlloc
00068     {
00069     private:
00070         // Pre-blended 
00071         HardwareVertexBufferSharedPtr srcPositionBuffer;
00072         HardwareVertexBufferSharedPtr srcNormalBuffer;
00073         // Post-blended 
00074         HardwareVertexBufferSharedPtr destPositionBuffer;
00075         HardwareVertexBufferSharedPtr destNormalBuffer;
00077         bool posNormalShareBuffer;
00078         unsigned short posBindIndex;
00079         unsigned short normBindIndex;
00080         bool bindPositions;
00081         bool bindNormals;
00082 
00083     public:
00084         ~TempBlendedBufferInfo(void);
00086         void extractFrom(const VertexData* sourceData);
00088         void checkoutTempCopies(bool positions = true, bool normals = true);
00090         void bindTempCopies(VertexData* targetData, bool suppressHardwareUpload);
00092         void licenseExpired(HardwareBuffer* buffer);
00094         bool buffersCheckedOut(bool positions = true, bool normals = true) const;
00095     };
00096 
00097 
00109     class _OgreExport HardwareBufferManagerBase : public BufferAlloc
00110     {
00111         friend class HardwareVertexBufferSharedPtr;
00112         friend class HardwareIndexBufferSharedPtr;
00113     protected:
00119         typedef set<HardwareVertexBuffer*>::type VertexBufferList;
00120         typedef set<HardwareIndexBuffer*>::type IndexBufferList;
00121         VertexBufferList mVertexBuffers;
00122         IndexBufferList mIndexBuffers;
00123 
00124 
00125         typedef set<VertexDeclaration*>::type VertexDeclarationList;
00126         typedef set<VertexBufferBinding*>::type VertexBufferBindingList;
00127         VertexDeclarationList mVertexDeclarations;
00128         VertexBufferBindingList mVertexBufferBindings;
00129 
00130         // Mutexes
00131         OGRE_MUTEX(mVertexBuffersMutex)
00132         OGRE_MUTEX(mIndexBuffersMutex)
00133         OGRE_MUTEX(mVertexDeclarationsMutex)
00134         OGRE_MUTEX(mVertexBufferBindingsMutex)
00135 
00137         virtual void destroyAllDeclarations(void);
00139         virtual void destroyAllBindings(void);
00140 
00142         virtual VertexDeclaration* createVertexDeclarationImpl(void);
00144         virtual void destroyVertexDeclarationImpl(VertexDeclaration* decl);
00145 
00147         virtual VertexBufferBinding* createVertexBufferBindingImpl(void);
00149         virtual void destroyVertexBufferBindingImpl(VertexBufferBinding* binding);
00150 
00151     public:
00152 
00153         enum BufferLicenseType
00154         {
00156             BLT_MANUAL_RELEASE,
00158             BLT_AUTOMATIC_RELEASE
00159         };
00160 
00161     protected:
00163         class _OgrePrivate VertexBufferLicense
00164         {
00165         public:
00166             HardwareVertexBuffer* originalBufferPtr;
00167             BufferLicenseType licenseType;
00168             size_t expiredDelay;
00169             HardwareVertexBufferSharedPtr buffer;
00170             HardwareBufferLicensee* licensee;
00171             VertexBufferLicense(
00172                 HardwareVertexBuffer* orig,
00173                 BufferLicenseType ltype, 
00174                 size_t delay,
00175                 HardwareVertexBufferSharedPtr buf, 
00176                 HardwareBufferLicensee* lic) 
00177                 : originalBufferPtr(orig)
00178                 , licenseType(ltype)
00179                 , expiredDelay(delay)
00180                 , buffer(buf)
00181                 , licensee(lic)
00182             {}
00183 
00184         };
00185 
00187         typedef multimap<HardwareVertexBuffer*, HardwareVertexBufferSharedPtr>::type FreeTemporaryVertexBufferMap;
00189         FreeTemporaryVertexBufferMap mFreeTempVertexBufferMap;
00191         typedef map<HardwareVertexBuffer*, VertexBufferLicense>::type TemporaryVertexBufferLicenseMap;
00193         TemporaryVertexBufferLicenseMap mTempVertexBufferLicenses;
00195         size_t mUnderUsedFrameCount;
00197         static const size_t UNDER_USED_FRAME_THRESHOLD;
00199         static const size_t EXPIRED_DELAY_FRAME_THRESHOLD;
00200         // Mutexes
00201         OGRE_MUTEX(mTempBuffersMutex)
00202 
00203 
00204         
00205         virtual HardwareVertexBufferSharedPtr makeBufferCopy(
00206             const HardwareVertexBufferSharedPtr& source, 
00207             HardwareBuffer::Usage usage, bool useShadowBuffer);
00208 
00209     public:
00210         HardwareBufferManagerBase();
00211         virtual ~HardwareBufferManagerBase();
00240         virtual HardwareVertexBufferSharedPtr 
00241             createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage, 
00242             bool useShadowBuffer = false) = 0;
00259         virtual HardwareIndexBufferSharedPtr 
00260             createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes, 
00261             HardwareBuffer::Usage usage, bool useShadowBuffer = false) = 0;
00262 
00267         virtual RenderToVertexBufferSharedPtr createRenderToVertexBuffer() = 0;
00268 
00270         virtual VertexDeclaration* createVertexDeclaration(void);
00272         virtual void destroyVertexDeclaration(VertexDeclaration* decl);
00273 
00275         virtual VertexBufferBinding* createVertexBufferBinding(void);
00277         virtual void destroyVertexBufferBinding(VertexBufferBinding* binding);
00278 
00284         virtual void registerVertexBufferSourceAndCopy(
00285             const HardwareVertexBufferSharedPtr& sourceBuffer,
00286             const HardwareVertexBufferSharedPtr& copy);
00287 
00304         virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(
00305             const HardwareVertexBufferSharedPtr& sourceBuffer, 
00306             BufferLicenseType licenseType,
00307             HardwareBufferLicensee* licensee,
00308             bool copyData = false);
00309 
00318         virtual void releaseVertexBufferCopy(
00319             const HardwareVertexBufferSharedPtr& bufferCopy); 
00320 
00331         virtual void touchVertexBufferCopy(
00332             const HardwareVertexBufferSharedPtr& bufferCopy);
00333 
00343         virtual void _freeUnusedBufferCopies(void);
00344 
00351         virtual void _releaseBufferCopies(bool forceFreeUnused = false);
00352 
00362         virtual void _forceReleaseBufferCopies(
00363             const HardwareVertexBufferSharedPtr& sourceBuffer);
00364 
00374         virtual void _forceReleaseBufferCopies(HardwareVertexBuffer* sourceBuffer);
00375 
00377         void _notifyVertexBufferDestroyed(HardwareVertexBuffer* buf);
00379         void _notifyIndexBufferDestroyed(HardwareIndexBuffer* buf);
00380 
00381     };
00382 
00384     class _OgreExport HardwareBufferManager : public HardwareBufferManagerBase, public Singleton<HardwareBufferManager>
00385     {
00386         friend class HardwareVertexBufferSharedPtr;
00387         friend class HardwareIndexBufferSharedPtr;
00388     protected:
00389         HardwareBufferManagerBase* mImpl;
00390     public:
00391         HardwareBufferManager(HardwareBufferManagerBase* imp);
00392         ~HardwareBufferManager();
00393 
00395         HardwareVertexBufferSharedPtr 
00396             createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage, 
00397             bool useShadowBuffer = false)
00398         {
00399             return mImpl->createVertexBuffer(vertexSize, numVerts, usage, useShadowBuffer);
00400         }
00402         HardwareIndexBufferSharedPtr 
00403             createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes, 
00404             HardwareBuffer::Usage usage, bool useShadowBuffer = false)
00405         {
00406             return mImpl->createIndexBuffer(itype, numIndexes, usage, useShadowBuffer);
00407         }
00408 
00410         RenderToVertexBufferSharedPtr createRenderToVertexBuffer()
00411         {
00412             return mImpl->createRenderToVertexBuffer();
00413         }
00414 
00416         virtual VertexDeclaration* createVertexDeclaration(void)
00417         {
00418             return mImpl->createVertexDeclaration();
00419         }
00421         virtual void destroyVertexDeclaration(VertexDeclaration* decl)
00422         {
00423             mImpl->destroyVertexDeclaration(decl);
00424         }
00425 
00427         virtual VertexBufferBinding* createVertexBufferBinding(void)
00428         {
00429             return mImpl->createVertexBufferBinding();
00430         }
00432         virtual void destroyVertexBufferBinding(VertexBufferBinding* binding)
00433         {
00434             mImpl->destroyVertexBufferBinding(binding);
00435         }
00437         virtual void registerVertexBufferSourceAndCopy(
00438             const HardwareVertexBufferSharedPtr& sourceBuffer,
00439             const HardwareVertexBufferSharedPtr& copy)
00440         {
00441             mImpl->registerVertexBufferSourceAndCopy(sourceBuffer, copy);
00442         }
00444         virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(
00445             const HardwareVertexBufferSharedPtr& sourceBuffer, 
00446             BufferLicenseType licenseType,
00447             HardwareBufferLicensee* licensee,
00448             bool copyData = false)
00449         {
00450             return mImpl->allocateVertexBufferCopy(sourceBuffer, licenseType, licensee, copyData);
00451         }
00453         virtual void releaseVertexBufferCopy(
00454             const HardwareVertexBufferSharedPtr& bufferCopy)
00455         {
00456             mImpl->releaseVertexBufferCopy(bufferCopy);
00457         }
00458 
00460         virtual void touchVertexBufferCopy(
00461             const HardwareVertexBufferSharedPtr& bufferCopy)
00462         {
00463             mImpl->touchVertexBufferCopy(bufferCopy);
00464         }
00465 
00467         virtual void _freeUnusedBufferCopies(void)
00468         {
00469             mImpl->_freeUnusedBufferCopies();
00470         }
00472         virtual void _releaseBufferCopies(bool forceFreeUnused = false)
00473         {
00474             mImpl->_releaseBufferCopies(forceFreeUnused);
00475         }
00477         virtual void _forceReleaseBufferCopies(
00478             const HardwareVertexBufferSharedPtr& sourceBuffer)
00479         {
00480             mImpl->_forceReleaseBufferCopies(sourceBuffer);
00481         }
00483         virtual void _forceReleaseBufferCopies(HardwareVertexBuffer* sourceBuffer)
00484         {
00485             mImpl->_forceReleaseBufferCopies(sourceBuffer);
00486         }
00488         void _notifyVertexBufferDestroyed(HardwareVertexBuffer* buf)
00489         {
00490             mImpl->_notifyVertexBufferDestroyed(buf);
00491         }
00493         void _notifyIndexBufferDestroyed(HardwareIndexBuffer* buf)
00494         {
00495             mImpl->_notifyIndexBufferDestroyed(buf);
00496         }
00497 
00498 
00514         static HardwareBufferManager& getSingleton(void);
00530         static HardwareBufferManager* getSingletonPtr(void);
00531             
00532     };
00533 
00536 }
00537 
00538 #endif
00539 

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:24 2012