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
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sun Sep 2 2012 07:27:22