OGRE  1.7
Object-Oriented Graphics Rendering Engine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OgreHardwareBufferManager.h
Go to the documentation of this file.
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of OGRE
4  (Object-oriented Graphics Rendering Engine)
5 For the latest info, see http://www.ogre3d.org/
6 
7 Copyright (c) 2000-2011 Torus Knot Software Ltd
8 
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
15 
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 THE SOFTWARE.
26 -----------------------------------------------------------------------------
27 */
28 #ifndef __HardwareBufferManager__
29 #define __HardwareBufferManager__
30 
31 // Precompiler options
32 #include "OgrePrerequisites.h"
33 
34 #include "OgreSingleton.h"
38 
39 namespace Ogre {
58  {
59  public:
63  virtual void licenseExpired(HardwareBuffer* buffer) = 0;
64  };
65 
68  {
69  private:
70  // Pre-blended
73  // Post-blended
78  unsigned short posBindIndex;
79  unsigned short normBindIndex;
82 
83  public:
84  ~TempBlendedBufferInfo(void);
86  void extractFrom(const VertexData* sourceData);
88  void checkoutTempCopies(bool positions = true, bool normals = true);
90  void bindTempCopies(VertexData* targetData, bool suppressHardwareUpload);
92  void licenseExpired(HardwareBuffer* buffer);
94  bool buffersCheckedOut(bool positions = true, bool normals = true) const;
95  };
96 
97 
110  {
113  protected:
123 
124 
129 
130  // Mutexes
131  OGRE_MUTEX(mVertexBuffersMutex)
132  OGRE_MUTEX(mIndexBuffersMutex)
133  OGRE_MUTEX(mVertexDeclarationsMutex)
134  OGRE_MUTEX(mVertexBufferBindingsMutex)
135 
137  virtual void destroyAllDeclarations(void);
139  virtual void destroyAllBindings(void);
140 
142  virtual VertexDeclaration* createVertexDeclarationImpl(void);
144  virtual void destroyVertexDeclarationImpl(VertexDeclaration* decl);
145 
147  virtual VertexBufferBinding* createVertexBufferBindingImpl(void);
149  virtual void destroyVertexBufferBindingImpl(VertexBufferBinding* binding);
150 
151  public:
152 
154  {
158  BLT_AUTOMATIC_RELEASE
159  };
160 
161  protected:
164  {
165  public:
168  size_t expiredDelay;
172  HardwareVertexBuffer* orig,
173  BufferLicenseType ltype,
174  size_t delay,
177  : originalBufferPtr(orig)
178  , licenseType(ltype)
179  , expiredDelay(delay)
180  , buffer(buf)
181  , licensee(lic)
182  {}
183 
184  };
185 
197  static const size_t UNDER_USED_FRAME_THRESHOLD;
199  static const size_t EXPIRED_DELAY_FRAME_THRESHOLD;
200  // Mutexes
201  OGRE_MUTEX(mTempBuffersMutex)
202 
203 
204 
205  virtual HardwareVertexBufferSharedPtr makeBufferCopy(
206  const HardwareVertexBufferSharedPtr& source,
207  HardwareBuffer::Usage usage, bool useShadowBuffer);
208 
209  public:
211  virtual ~HardwareBufferManagerBase();
241  createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage,
242  bool useShadowBuffer = false) = 0;
260  createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes,
261  HardwareBuffer::Usage usage, bool useShadowBuffer = false) = 0;
262 
267  virtual RenderToVertexBufferSharedPtr createRenderToVertexBuffer() = 0;
268 
270  virtual VertexDeclaration* createVertexDeclaration(void);
272  virtual void destroyVertexDeclaration(VertexDeclaration* decl);
273 
275  virtual VertexBufferBinding* createVertexBufferBinding(void);
277  virtual void destroyVertexBufferBinding(VertexBufferBinding* binding);
278 
284  virtual void registerVertexBufferSourceAndCopy(
285  const HardwareVertexBufferSharedPtr& sourceBuffer,
286  const HardwareVertexBufferSharedPtr& copy);
287 
304  virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(
305  const HardwareVertexBufferSharedPtr& sourceBuffer,
306  BufferLicenseType licenseType,
307  HardwareBufferLicensee* licensee,
308  bool copyData = false);
309 
318  virtual void releaseVertexBufferCopy(
319  const HardwareVertexBufferSharedPtr& bufferCopy);
320 
331  virtual void touchVertexBufferCopy(
332  const HardwareVertexBufferSharedPtr& bufferCopy);
333 
343  virtual void _freeUnusedBufferCopies(void);
344 
351  virtual void _releaseBufferCopies(bool forceFreeUnused = false);
352 
362  virtual void _forceReleaseBufferCopies(
363  const HardwareVertexBufferSharedPtr& sourceBuffer);
364 
374  virtual void _forceReleaseBufferCopies(HardwareVertexBuffer* sourceBuffer);
375 
377  void _notifyVertexBufferDestroyed(HardwareVertexBuffer* buf);
379  void _notifyIndexBufferDestroyed(HardwareIndexBuffer* buf);
380 
381  };
382 
384  class _OgreExport HardwareBufferManager : public HardwareBufferManagerBase, public Singleton<HardwareBufferManager>
385  {
388  protected:
389  HardwareBufferManagerBase* mImpl;
390  public:
391  HardwareBufferManager(HardwareBufferManagerBase* imp);
392  ~HardwareBufferManager();
393 
396  createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage,
397  bool useShadowBuffer = false)
398  {
399  return mImpl->createVertexBuffer(vertexSize, numVerts, usage, useShadowBuffer);
400  }
404  HardwareBuffer::Usage usage, bool useShadowBuffer = false)
405  {
406  return mImpl->createIndexBuffer(itype, numIndexes, usage, useShadowBuffer);
407  }
408 
411  {
412  return mImpl->createRenderToVertexBuffer();
413  }
414 
417  {
418  return mImpl->createVertexDeclaration();
419  }
422  {
423  mImpl->destroyVertexDeclaration(decl);
424  }
425 
428  {
429  return mImpl->createVertexBufferBinding();
430  }
433  {
434  mImpl->destroyVertexBufferBinding(binding);
435  }
438  const HardwareVertexBufferSharedPtr& sourceBuffer,
439  const HardwareVertexBufferSharedPtr& copy)
440  {
441  mImpl->registerVertexBufferSourceAndCopy(sourceBuffer, copy);
442  }
445  const HardwareVertexBufferSharedPtr& sourceBuffer,
446  BufferLicenseType licenseType,
447  HardwareBufferLicensee* licensee,
448  bool copyData = false)
449  {
450  return mImpl->allocateVertexBufferCopy(sourceBuffer, licenseType, licensee, copyData);
451  }
454  const HardwareVertexBufferSharedPtr& bufferCopy)
455  {
456  mImpl->releaseVertexBufferCopy(bufferCopy);
457  }
458 
460  virtual void touchVertexBufferCopy(
461  const HardwareVertexBufferSharedPtr& bufferCopy)
462  {
463  mImpl->touchVertexBufferCopy(bufferCopy);
464  }
465 
467  virtual void _freeUnusedBufferCopies(void)
468  {
469  mImpl->_freeUnusedBufferCopies();
470  }
472  virtual void _releaseBufferCopies(bool forceFreeUnused = false)
473  {
474  mImpl->_releaseBufferCopies(forceFreeUnused);
475  }
478  const HardwareVertexBufferSharedPtr& sourceBuffer)
479  {
480  mImpl->_forceReleaseBufferCopies(sourceBuffer);
481  }
484  {
485  mImpl->_forceReleaseBufferCopies(sourceBuffer);
486  }
489  {
490  mImpl->_notifyVertexBufferDestroyed(buf);
491  }
494  {
495  mImpl->_notifyIndexBufferDestroyed(buf);
496  }
497 
498 
514  static HardwareBufferManager& getSingleton(void);
530  static HardwareBufferManager* getSingletonPtr(void);
531 
532  };
533 
536 }
537 
538 #endif
539 
HardwareVertexBufferSharedPtr createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage, bool useShadowBuffer=false)
virtual void destroyVertexBufferBinding(VertexBufferBinding *binding)
HardwareVertexBufferSharedPtr srcNormalBuffer
void _notifyIndexBufferDestroyed(HardwareIndexBuffer *buf)
Notification that a hardware index buffer has been destroyed.
size_t mUnderUsedFrameCount
Number of frames elapsed since temporary buffers utilization was above half the available.
virtual void _freeUnusedBufferCopies(void)
Free all unused vertex buffer copies.
#define _OgreExport
Definition: OgrePlatform.h:203
Singleton wrapper for hardware buffer manager.
Records the state of all the vertex buffer bindings required to provide a vertex declaration with the...
virtual void registerVertexBufferSourceAndCopy(const HardwareVertexBufferSharedPtr &sourceBuffer, const HardwareVertexBufferSharedPtr &copy)
virtual void _forceReleaseBufferCopies(const HardwareVertexBufferSharedPtr &sourceBuffer)
Internal method that forces the release of copies of a given buffer.
Structure for recording the use of temporary blend buffers.
Template class for creating single-instance global classes.
Definition: OgreSingleton.h:64
virtual void _forceReleaseBufferCopies(const HardwareVertexBufferSharedPtr &sourceBuffer)
HardwareBufferManagerBase * mImpl
VertexBufferLicense(HardwareVertexBuffer *orig, BufferLicenseType ltype, size_t delay, HardwareVertexBufferSharedPtr buf, HardwareBufferLicensee *lic)
virtual void destroyVertexDeclaration(VertexDeclaration *decl)
Specialisation of HardwareBuffer for vertex index buffers, still abstract.
virtual void releaseVertexBufferCopy(const HardwareVertexBufferSharedPtr &bufferCopy)
virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(const HardwareVertexBufferSharedPtr &sourceBuffer, BufferLicenseType licenseType, HardwareBufferLicensee *licensee, bool copyData=false)
Allocates a copy of a given vertex buffer.
virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(const HardwareVertexBufferSharedPtr &sourceBuffer, BufferLicenseType licenseType, HardwareBufferLicensee *licensee, bool copyData=false)
#define OGRE_MUTEX(name)
Shared pointer implementation used to share index buffers.
void _notifyIndexBufferDestroyed(HardwareIndexBuffer *buf)
virtual void registerVertexBufferSourceAndCopy(const HardwareVertexBufferSharedPtr &sourceBuffer, const HardwareVertexBufferSharedPtr &copy)
Registers a vertex buffer as a copy of another.
Shared pointer implementation used to share index buffers.
virtual void touchVertexBufferCopy(const HardwareVertexBufferSharedPtr &bufferCopy)
Tell engine that the vertex buffer copy intent to reuse.
bool posNormalShareBuffer
Both positions and normals are contained in the same buffer.
static const size_t UNDER_USED_FRAME_THRESHOLD
Number of frames to wait before free unused temporary buffers.
void _notifyVertexBufferDestroyed(HardwareVertexBuffer *buf)
virtual void _releaseBufferCopies(bool forceFreeUnused=false)
Internal method for releasing all temporary buffers which have been allocated using BLT_AUTOMATIC_REL...
HardwareVertexBufferSharedPtr destNormalBuffer
Licensee will only release buffer when it says so.
Abstract interface representing a 'licensee' of a hardware buffer copy.
#define _OgrePrivate
Definition: OgrePlatform.h:204
TemporaryVertexBufferLicenseMap mTempVertexBufferLicenses
Map of currently licensed temporary buffers.
HardwareVertexBufferSharedPtr destPositionBuffer
virtual VertexBufferBinding * createVertexBufferBinding(void)
Creates a new VertexBufferBinding.
HardwareIndexBufferSharedPtr createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes, HardwareBuffer::Usage usage, bool useShadowBuffer=false)
RenderToVertexBufferSharedPtr createRenderToVertexBuffer()
Superclass for all objects that wish to use custom memory allocators when their new / delete operator...
virtual RenderToVertexBufferSharedPtr createRenderToVertexBuffer()=0
Create a render to vertex buffer.
Base definition of a hardware buffer manager.
map< HardwareVertexBuffer *, VertexBufferLicense >::type TemporaryVertexBufferLicenseMap
Map from temporary buffer to details of a license.
set< VertexDeclaration * >::type VertexDeclarationList
Usage
Enums describing buffer usage; not mutually exclusive.
virtual void _releaseBufferCopies(bool forceFreeUnused=false)
multimap< HardwareVertexBuffer *, HardwareVertexBufferSharedPtr >::type FreeTemporaryVertexBufferMap
Map from original buffer to temporary buffers.
virtual void releaseVertexBufferCopy(const HardwareVertexBufferSharedPtr &bufferCopy)
Manually release a vertex buffer copy for others to subsequently use.
set< HardwareVertexBuffer * >::type VertexBufferList
WARNING: The following two members should place before all other members.
HardwareVertexBufferSharedPtr srcPositionBuffer
Summary class collecting together vertex source information.
This class declares the format of a set of vertex inputs, which can be issued to the rendering API th...
void _notifyVertexBufferDestroyed(HardwareVertexBuffer *buf)
Notification that a hardware vertex buffer has been destroyed.
virtual VertexBufferBinding * createVertexBufferBinding(void)
FreeTemporaryVertexBufferMap mFreeTempVertexBufferMap
Map of current available temp buffers.
Struct holding details of a license to use a temporary shared buffer.
Abstract class defining common features of hardware buffers.
set< VertexBufferBinding * >::type VertexBufferBindingList
Specialisation of HardwareBuffer for a vertex buffer.
virtual void destroyVertexBufferBinding(VertexBufferBinding *binding)
Destroys a VertexBufferBinding.
Reference-counted shared pointer, used for objects where implicit destruction is required.
Definition: OgreSharedPtr.h:60
virtual HardwareIndexBufferSharedPtr createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes, HardwareBuffer::Usage usage, bool useShadowBuffer=false)=0
Create a hardware index buffer.
virtual VertexDeclaration * createVertexDeclaration(void)
virtual void _forceReleaseBufferCopies(HardwareVertexBuffer *sourceBuffer)
static const size_t EXPIRED_DELAY_FRAME_THRESHOLD
Frame delay for BLT_AUTOMATIC_RELEASE temporary buffers.
virtual void destroyVertexDeclaration(VertexDeclaration *decl)
Destroys a vertex declaration.
virtual HardwareVertexBufferSharedPtr createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage, bool useShadowBuffer=false)=0
Create a hardware vertex buffer.
set< HardwareIndexBuffer * >::type IndexBufferList
virtual void touchVertexBufferCopy(const HardwareVertexBufferSharedPtr &bufferCopy)
virtual VertexDeclaration * createVertexDeclaration(void)
Creates a new vertex declaration.
VertexBufferBindingList mVertexBufferBindings