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

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Mon Jul 27 2020 13:40:43