| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /*
- -----------------------------------------------------------------------------
- This source file is part of OGRE
- (Object-oriented Graphics Rendering Engine)
- For the latest info, see http://www.ogre3d.org/
- Copyright (c) 2000-2011 Torus Knot Software Ltd
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- -----------------------------------------------------------------------------
- */
- #include "CmHardwareBufferManager.h"
- #include "CmVertexIndexData.h"
- namespace CamelotEngine {
- //---------------------------------------------------------------------
- HardwareBufferManager::HardwareBufferManager(HardwareBufferManagerBase* imp)
- : HardwareBufferManagerBase(), mImpl(imp)
- {
- }
- //---------------------------------------------------------------------
- HardwareBufferManager::~HardwareBufferManager()
- {
- // mImpl must be deleted by the creator
- }
- //-----------------------------------------------------------------------
- HardwareBufferManagerBase::HardwareBufferManagerBase()
- {
- }
- //-----------------------------------------------------------------------
- HardwareBufferManagerBase::~HardwareBufferManagerBase()
- {
- // Clear vertex/index buffer list first, avoid destroyed notify do
- // unnecessary work, and we'll destroy everything here.
- mVertexBuffers.clear();
- mIndexBuffers.clear();
- // Destroy everything
- destroyAllBindings();
- // No need to destroy main buffers - they will be destroyed by removal of bindings
- // No need to destroy temp buffers - they will be destroyed automatically.
- }
- //-----------------------------------------------------------------------
- VertexDeclarationPtr HardwareBufferManagerBase::createVertexDeclaration(void)
- {
- VertexDeclarationPtr decl = createVertexDeclarationImpl();
- return decl;
- }
- //-----------------------------------------------------------------------
- VertexBufferBinding* HardwareBufferManagerBase::createVertexBufferBinding(void)
- {
- VertexBufferBinding* ret = createVertexBufferBindingImpl();
- CM_LOCK_MUTEX(mVertexBufferBindingsMutex)
- mVertexBufferBindings.insert(ret);
- return ret;
- }
- //-----------------------------------------------------------------------
- void HardwareBufferManagerBase::destroyVertexBufferBinding(VertexBufferBinding* binding)
- {
- CM_LOCK_MUTEX(mVertexBufferBindingsMutex)
- mVertexBufferBindings.erase(binding);
- destroyVertexBufferBindingImpl(binding);
- }
- //-----------------------------------------------------------------------
- VertexDeclarationPtr HardwareBufferManagerBase::createVertexDeclarationImpl(void)
- {
- return VertexDeclarationPtr(new VertexDeclaration());
- }
- //-----------------------------------------------------------------------
- VertexBufferBinding* HardwareBufferManagerBase::createVertexBufferBindingImpl(void)
- {
- return new VertexBufferBinding();
- }
- //-----------------------------------------------------------------------
- void HardwareBufferManagerBase::destroyVertexBufferBindingImpl(VertexBufferBinding* binding)
- {
- delete binding;
- }
- //-----------------------------------------------------------------------
- void HardwareBufferManagerBase::destroyAllBindings(void)
- {
- CM_LOCK_MUTEX(mVertexBufferBindingsMutex)
- VertexBufferBindingList::iterator bind;
- for (bind = mVertexBufferBindings.begin(); bind != mVertexBufferBindings.end(); ++bind)
- {
- destroyVertexBufferBindingImpl(*bind);
- }
- mVertexBufferBindings.clear();
- }
- //-----------------------------------------------------------------------
- HardwareVertexBufferPtr
- HardwareBufferManagerBase::allocateVertexBufferCopy(
- const HardwareVertexBufferPtr& sourceBuffer,
- bool copyData)
- {
- // pre-lock the mVertexBuffers mutex, which would usually get locked in
- // makeBufferCopy / createVertexBuffer
- // this prevents a deadlock in _notifyVertexBufferDestroyed
- // which locks the same mutexes (via other methods) but in reverse order
- CM_LOCK_MUTEX(mVertexBuffersMutex)
- {
- CM_LOCK_MUTEX(mTempBuffersMutex)
- HardwareVertexBufferPtr vbuf;
- // Locate existing buffer copy in temporary vertex buffers
- // copy buffer, use shadow buffer and make dynamic
- vbuf = makeBufferCopy(
- sourceBuffer,
- HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE,
- true);
- // Copy data?
- if (copyData)
- {
- vbuf->copyData(*(sourceBuffer.get()), 0, 0, sourceBuffer->getSizeInBytes(), true);
- }
- return vbuf;
- }
- }
- //-----------------------------------------------------------------------
- void HardwareBufferManagerBase::_notifyVertexBufferDestroyed(HardwareVertexBuffer* buf)
- {
- CM_LOCK_MUTEX(mVertexBuffersMutex)
- VertexBufferList::iterator i = mVertexBuffers.find(buf);
- if (i != mVertexBuffers.end())
- {
- // release vertex buffer copies
- mVertexBuffers.erase(i);
- }
- }
- //-----------------------------------------------------------------------
- void HardwareBufferManagerBase::_notifyIndexBufferDestroyed(HardwareIndexBuffer* buf)
- {
- CM_LOCK_MUTEX(mIndexBuffersMutex)
- IndexBufferList::iterator i = mIndexBuffers.find(buf);
- if (i != mIndexBuffers.end())
- {
- mIndexBuffers.erase(i);
- }
- }
- //-----------------------------------------------------------------------
- HardwareVertexBufferPtr
- HardwareBufferManagerBase::makeBufferCopy(
- const HardwareVertexBufferPtr& source,
- HardwareBuffer::Usage usage, bool useShadowBuffer)
- {
- return this->createVertexBuffer(
- source->getVertexSize(),
- source->getNumVertices(),
- usage, useShadowBuffer);
- }
- }
|