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-2013 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 "OgreHardwareCounterBuffer.h"
00036 #include "OgreHardwareIndexBuffer.h"
00037 #include "OgreHardwareUniformBuffer.h"
00038 #include "OgreHardwareVertexBuffer.h"
00039 #include "OgreRenderToVertexBuffer.h"
00040 #include "OgreHeaderPrefix.h"
00041 
00042 namespace Ogre {
00060     class _OgreExport HardwareBufferLicensee
00061     {
00062     public:
00063         virtual ~HardwareBufferLicensee() { }
00067         virtual void licenseExpired(HardwareBuffer* buffer) = 0;
00068     };
00069 
00071     class _OgreExport TempBlendedBufferInfo : public HardwareBufferLicensee, public BufferAlloc
00072     {
00073     private:
00074         // Pre-blended 
00075         HardwareVertexBufferSharedPtr srcPositionBuffer;
00076         HardwareVertexBufferSharedPtr srcNormalBuffer;
00077         // Post-blended 
00078         HardwareVertexBufferSharedPtr destPositionBuffer;
00079         HardwareVertexBufferSharedPtr destNormalBuffer;
00081         bool posNormalShareBuffer;
00082         unsigned short posBindIndex;
00083         unsigned short normBindIndex;
00084         bool bindPositions;
00085         bool bindNormals;
00086 
00087     public:
00088         ~TempBlendedBufferInfo(void);
00090         void extractFrom(const VertexData* sourceData);
00092         void checkoutTempCopies(bool positions = true, bool normals = true);
00094         void bindTempCopies(VertexData* targetData, bool suppressHardwareUpload);
00096         void licenseExpired(HardwareBuffer* buffer);
00098         bool buffersCheckedOut(bool positions = true, bool normals = true) const;
00099     };
00100 
00101 
00113     class _OgreExport HardwareBufferManagerBase : public BufferAlloc
00114     {
00115         friend class HardwareVertexBufferSharedPtr;
00116         friend class HardwareIndexBufferSharedPtr;
00117     protected:
00123         typedef set<HardwareVertexBuffer*>::type VertexBufferList;
00124         typedef set<HardwareIndexBuffer*>::type IndexBufferList;
00125         typedef set<HardwareUniformBuffer*>::type UniformBufferList;
00126         typedef set<HardwareCounterBuffer*>::type CounterBufferList;
00127         VertexBufferList mVertexBuffers;
00128         IndexBufferList mIndexBuffers;
00129         UniformBufferList mUniformBuffers;
00130         CounterBufferList mCounterBuffers;
00131 
00132 
00133         typedef set<VertexDeclaration*>::type VertexDeclarationList;
00134         typedef set<VertexBufferBinding*>::type VertexBufferBindingList;
00135         VertexDeclarationList mVertexDeclarations;
00136         VertexBufferBindingList mVertexBufferBindings;
00137 
00138         // Mutexes
00139         OGRE_MUTEX(mVertexBuffersMutex);
00140         OGRE_MUTEX(mIndexBuffersMutex);
00141         OGRE_MUTEX(mUniformBuffersMutex);
00142         OGRE_MUTEX(mCounterBuffersMutex);
00143         OGRE_MUTEX(mVertexDeclarationsMutex);
00144         OGRE_MUTEX(mVertexBufferBindingsMutex);
00145 
00147         virtual void destroyAllDeclarations(void);
00149         virtual void destroyAllBindings(void);
00150 
00152         virtual VertexDeclaration* createVertexDeclarationImpl(void);
00154         virtual void destroyVertexDeclarationImpl(VertexDeclaration* decl);
00155 
00157         virtual VertexBufferBinding* createVertexBufferBindingImpl(void);
00159         virtual void destroyVertexBufferBindingImpl(VertexBufferBinding* binding);
00160 
00161     public:
00162 
00163         enum BufferLicenseType
00164         {
00166             BLT_MANUAL_RELEASE,
00168             BLT_AUTOMATIC_RELEASE
00169         };
00170 
00171     protected:
00173         class _OgrePrivate VertexBufferLicense
00174         {
00175         public:
00176             HardwareVertexBuffer* originalBufferPtr;
00177             BufferLicenseType licenseType;
00178             size_t expiredDelay;
00179             HardwareVertexBufferSharedPtr buffer;
00180             HardwareBufferLicensee* licensee;
00181             VertexBufferLicense(
00182                 HardwareVertexBuffer* orig,
00183                 BufferLicenseType ltype, 
00184                 size_t delay,
00185                 HardwareVertexBufferSharedPtr buf, 
00186                 HardwareBufferLicensee* lic) 
00187                 : originalBufferPtr(orig)
00188                 , licenseType(ltype)
00189                 , expiredDelay(delay)
00190                 , buffer(buf)
00191                 , licensee(lic)
00192             {}
00193 
00194         };
00195 
00197         typedef multimap<HardwareVertexBuffer*, HardwareVertexBufferSharedPtr>::type FreeTemporaryVertexBufferMap;
00199         FreeTemporaryVertexBufferMap mFreeTempVertexBufferMap;
00201         typedef map<HardwareVertexBuffer*, VertexBufferLicense>::type TemporaryVertexBufferLicenseMap;
00203         TemporaryVertexBufferLicenseMap mTempVertexBufferLicenses;
00205         size_t mUnderUsedFrameCount;
00207         static const size_t UNDER_USED_FRAME_THRESHOLD;
00209         static const size_t EXPIRED_DELAY_FRAME_THRESHOLD;
00210         // Mutexes
00211         OGRE_MUTEX(mTempBuffersMutex);
00212 
00213 
00215         virtual HardwareVertexBufferSharedPtr makeBufferCopy(
00216             const HardwareVertexBufferSharedPtr& source, 
00217             HardwareBuffer::Usage usage, bool useShadowBuffer);
00218 
00219     public:
00220         HardwareBufferManagerBase();
00221         virtual ~HardwareBufferManagerBase();
00254         virtual HardwareVertexBufferSharedPtr 
00255             createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage, 
00256             bool useShadowBuffer = false) = 0;
00277         virtual HardwareIndexBufferSharedPtr 
00278             createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes, 
00279             HardwareBuffer::Usage usage, bool useShadowBuffer = false) = 0;
00280 
00285         virtual RenderToVertexBufferSharedPtr createRenderToVertexBuffer() = 0;
00286 
00292         virtual HardwareUniformBufferSharedPtr createUniformBuffer(size_t sizeBytes, 
00293                                     HardwareBuffer::Usage usage = HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE, 
00294                                     bool useShadowBuffer = false, const String& name = "") = 0;
00295 
00300         virtual HardwareCounterBufferSharedPtr createCounterBuffer(size_t sizeBytes,
00301                                                                    HardwareBuffer::Usage usage = HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE,
00302                                                                    bool useShadowBuffer = false, const String& name = "") = 0;
00303 
00305         virtual VertexDeclaration* createVertexDeclaration(void);
00307         virtual void destroyVertexDeclaration(VertexDeclaration* decl);
00308 
00310         virtual VertexBufferBinding* createVertexBufferBinding(void);
00312         virtual void destroyVertexBufferBinding(VertexBufferBinding* binding);
00313 
00319         virtual void registerVertexBufferSourceAndCopy(
00320             const HardwareVertexBufferSharedPtr& sourceBuffer,
00321             const HardwareVertexBufferSharedPtr& copy);
00322 
00343         virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(
00344             const HardwareVertexBufferSharedPtr& sourceBuffer, 
00345             BufferLicenseType licenseType,
00346             HardwareBufferLicensee* licensee,
00347             bool copyData = false);
00348 
00358         virtual void releaseVertexBufferCopy(
00359             const HardwareVertexBufferSharedPtr& bufferCopy); 
00360 
00372         virtual void touchVertexBufferCopy(const HardwareVertexBufferSharedPtr& bufferCopy);
00373 
00383         virtual void _freeUnusedBufferCopies(void);
00384 
00392         virtual void _releaseBufferCopies(bool forceFreeUnused = false);
00393 
00404         virtual void _forceReleaseBufferCopies(const HardwareVertexBufferSharedPtr& sourceBuffer);
00405 
00416         virtual void _forceReleaseBufferCopies(HardwareVertexBuffer* sourceBuffer);
00417 
00419         void _notifyVertexBufferDestroyed(HardwareVertexBuffer* buf);
00421         void _notifyIndexBufferDestroyed(HardwareIndexBuffer* buf);
00423         void _notifyUniformBufferDestroyed(HardwareUniformBuffer* buf);
00425         void _notifyCounterBufferDestroyed(HardwareCounterBuffer* buf);
00426     };
00427 
00429     class _OgreExport HardwareBufferManager : public HardwareBufferManagerBase, public Singleton<HardwareBufferManager>
00430     {
00431         friend class HardwareVertexBufferSharedPtr;
00432         friend class HardwareIndexBufferSharedPtr;
00433     protected:
00434         HardwareBufferManagerBase* mImpl;
00435     public:
00436         HardwareBufferManager(HardwareBufferManagerBase* imp);
00437         ~HardwareBufferManager();
00438 
00440         HardwareVertexBufferSharedPtr 
00441             createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage, 
00442             bool useShadowBuffer = false)
00443         {
00444             return mImpl->createVertexBuffer(vertexSize, numVerts, usage, useShadowBuffer);
00445         }
00447         HardwareIndexBufferSharedPtr 
00448             createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes, 
00449             HardwareBuffer::Usage usage, bool useShadowBuffer = false)
00450         {
00451             return mImpl->createIndexBuffer(itype, numIndexes, usage, useShadowBuffer);
00452         }
00453 
00455         RenderToVertexBufferSharedPtr createRenderToVertexBuffer()
00456         {
00457             return mImpl->createRenderToVertexBuffer();
00458         }
00459 
00461         HardwareUniformBufferSharedPtr
00462                 createUniformBuffer(size_t sizeBytes, HardwareBuffer::Usage usage, bool useShadowBuffer, const String& name = "")
00463         {
00464             return mImpl->createUniformBuffer(sizeBytes, usage, useShadowBuffer, name);
00465         }
00466         
00468         HardwareCounterBufferSharedPtr
00469         createCounterBuffer(size_t sizeBytes, HardwareBuffer::Usage usage, bool useShadowBuffer, const String& name = "")
00470         {
00471             return mImpl->createCounterBuffer(sizeBytes, usage, useShadowBuffer, name);
00472         }
00473 
00475         virtual VertexDeclaration* createVertexDeclaration(void)
00476         {
00477             return mImpl->createVertexDeclaration();
00478         }
00480         virtual void destroyVertexDeclaration(VertexDeclaration* decl)
00481         {
00482             mImpl->destroyVertexDeclaration(decl);
00483         }
00484 
00486         virtual VertexBufferBinding* createVertexBufferBinding(void)
00487         {
00488             return mImpl->createVertexBufferBinding();
00489         }
00491         virtual void destroyVertexBufferBinding(VertexBufferBinding* binding)
00492         {
00493             mImpl->destroyVertexBufferBinding(binding);
00494         }
00496         virtual void registerVertexBufferSourceAndCopy(
00497             const HardwareVertexBufferSharedPtr& sourceBuffer,
00498             const HardwareVertexBufferSharedPtr& copy)
00499         {
00500             mImpl->registerVertexBufferSourceAndCopy(sourceBuffer, copy);
00501         }
00503         virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(
00504             const HardwareVertexBufferSharedPtr& sourceBuffer, 
00505             BufferLicenseType licenseType,
00506             HardwareBufferLicensee* licensee,
00507             bool copyData = false)
00508         {
00509             return mImpl->allocateVertexBufferCopy(sourceBuffer, licenseType, licensee, copyData);
00510         }
00512         virtual void releaseVertexBufferCopy(
00513             const HardwareVertexBufferSharedPtr& bufferCopy)
00514         {
00515             mImpl->releaseVertexBufferCopy(bufferCopy);
00516         }
00517 
00519         virtual void touchVertexBufferCopy(
00520             const HardwareVertexBufferSharedPtr& bufferCopy)
00521         {
00522             mImpl->touchVertexBufferCopy(bufferCopy);
00523         }
00524 
00526         virtual void _freeUnusedBufferCopies(void)
00527         {
00528             mImpl->_freeUnusedBufferCopies();
00529         }
00531         virtual void _releaseBufferCopies(bool forceFreeUnused = false)
00532         {
00533             mImpl->_releaseBufferCopies(forceFreeUnused);
00534         }
00536         virtual void _forceReleaseBufferCopies(
00537             const HardwareVertexBufferSharedPtr& sourceBuffer)
00538         {
00539             mImpl->_forceReleaseBufferCopies(sourceBuffer);
00540         }
00542         virtual void _forceReleaseBufferCopies(HardwareVertexBuffer* sourceBuffer)
00543         {
00544             mImpl->_forceReleaseBufferCopies(sourceBuffer);
00545         }
00547         void _notifyVertexBufferDestroyed(HardwareVertexBuffer* buf)
00548         {
00549             mImpl->_notifyVertexBufferDestroyed(buf);
00550         }
00552         void _notifyIndexBufferDestroyed(HardwareIndexBuffer* buf)
00553         {
00554             mImpl->_notifyIndexBufferDestroyed(buf);
00555         }
00557         void _notifyUniformBufferDestroyed(HardwareUniformBuffer* buf)
00558         {
00559             mImpl->_notifyUniformBufferDestroyed(buf);
00560         }
00562         void _notifyConterBufferDestroyed(HardwareCounterBuffer* buf)
00563         {
00564             mImpl->_notifyCounterBufferDestroyed(buf);
00565         }
00566 
00582         static HardwareBufferManager& getSingleton(void);
00598         static HardwareBufferManager* getSingletonPtr(void);
00599 
00600     };
00601 
00604 } // namespace Ogre
00605 
00606 #include "OgreHeaderSuffix.h"
00607 
00608 #endif // __HardwareBufferManager__
00609 

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 Mon Jul 27 2020 13:40:43