Skip to content

Commit

Permalink
Main: only use decorator pattern for DefaultHardwareBufferManager
Browse files Browse the repository at this point in the history
We can only ever have one active rendersystem and it resulted in useless
double indirection: decorator -> vtable -> impl
  • Loading branch information
paroj committed Jun 3, 2018
1 parent b892df6 commit 49dfbfe
Show file tree
Hide file tree
Showing 15 changed files with 143 additions and 433 deletions.
32 changes: 28 additions & 4 deletions OgreMain/include/OgreDefaultHardwareBufferManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,15 +182,39 @@ namespace Ogre {
/// DefaultHardwareBufferManager as a Singleton
class _OgreExport DefaultHardwareBufferManager : public HardwareBufferManager
{
std::unique_ptr<HardwareBufferManagerBase> mImpl;
public:
DefaultHardwareBufferManager()
: HardwareBufferManager(OGRE_NEW DefaultHardwareBufferManagerBase())
DefaultHardwareBufferManager() : mImpl(new DefaultHardwareBufferManagerBase()) {}

HardwareVertexBufferSharedPtr
createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage,
bool useShadowBuffer = false)
{
return mImpl->createVertexBuffer(vertexSize, numVerts, usage, useShadowBuffer);
}

HardwareIndexBufferSharedPtr
createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes,
HardwareBuffer::Usage usage, bool useShadowBuffer = false)
{
return mImpl->createIndexBuffer(itype, numIndexes, usage, useShadowBuffer);
}

RenderToVertexBufferSharedPtr createRenderToVertexBuffer()
{
return mImpl->createRenderToVertexBuffer();
}

HardwareUniformBufferSharedPtr
createUniformBuffer(size_t sizeBytes, HardwareBuffer::Usage usage, bool useShadowBuffer, const String& name = "")
{
return mImpl->createUniformBuffer(sizeBytes, usage, useShadowBuffer, name);
}
~DefaultHardwareBufferManager()

HardwareCounterBufferSharedPtr
createCounterBuffer(size_t sizeBytes, HardwareBuffer::Usage usage, bool useShadowBuffer, const String& name = "")
{
OGRE_DELETE mImpl;
return mImpl->createCounterBuffer(sizeBytes, usage, useShadowBuffer, name);
}
};

Expand Down
163 changes: 14 additions & 149 deletions OgreMain/include/OgreHardwareBufferManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,8 @@ namespace Ogre {
/** Base definition of a hardware buffer manager.
@remarks
This class is deliberately not a Singleton, so that multiple types can
exist at once. The Singleton is wrapped via the Decorator pattern
in HardwareBufferManager, below. Each concrete implementation should
provide a subclass of HardwareBufferManagerBase, which does the actual
work, and also a very simple subclass of HardwareBufferManager which
simply constructs the instance of the HardwareBufferManagerBase subclass
and passes it to the HardwareBufferManager superclass as a delegate.
This subclass must also delete the implementation instance it creates.
exist at once (notably DefaultHardwareBufferManagerBase).
The Singleton is add via the inheritance in HardwareBufferManager below.
*/
class _OgreExport HardwareBufferManagerBase : public BufferAlloc
{
Expand Down Expand Up @@ -300,14 +295,14 @@ namespace Ogre {
bool useShadowBuffer = false, const String& name = "") = 0;

/** Creates a new vertex declaration. */
virtual VertexDeclaration* createVertexDeclaration(void);
VertexDeclaration* createVertexDeclaration(void);
/** Destroys a vertex declaration. */
virtual void destroyVertexDeclaration(VertexDeclaration* decl);
void destroyVertexDeclaration(VertexDeclaration* decl);

/** Creates a new VertexBufferBinding. */
virtual VertexBufferBinding* createVertexBufferBinding(void);
VertexBufferBinding* createVertexBufferBinding(void);
/** Destroys a VertexBufferBinding. */
virtual void destroyVertexBufferBinding(VertexBufferBinding* binding);
void destroyVertexBufferBinding(VertexBufferBinding* binding);

/** Registers a vertex buffer as a copy of another.
@remarks
Expand Down Expand Up @@ -338,7 +333,7 @@ namespace Ogre {
If @c true, the current data is copied as well as the
structure of the buffer/
*/
virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(
HardwareVertexBufferSharedPtr allocateVertexBufferCopy(
const HardwareVertexBufferSharedPtr& sourceBuffer,
BufferLicenseType licenseType,
HardwareBufferLicensee* licensee,
Expand All @@ -353,8 +348,7 @@ namespace Ogre {
or at least no longer use this reference, since another user may
well begin to modify the contents of the buffer.
*/
virtual void releaseVertexBufferCopy(
const HardwareVertexBufferSharedPtr& bufferCopy);
void releaseVertexBufferCopy(const HardwareVertexBufferSharedPtr& bufferCopy);

/** Tell engine that the vertex buffer copy intent to reuse.
@remarks
Expand All @@ -367,7 +361,7 @@ namespace Ogre {
The buffer copy. The caller is expected to keep this
buffer copy for use.
*/
virtual void touchVertexBufferCopy(const HardwareVertexBufferSharedPtr& bufferCopy);
void touchVertexBufferCopy(const HardwareVertexBufferSharedPtr& bufferCopy);

/** Free all unused vertex buffer copies.
@remarks
Expand All @@ -378,7 +372,7 @@ namespace Ogre {
to save hardware memory (e.g. application was runs in a long time, you
might free temporary buffers periodically to avoid memory overload).
*/
virtual void _freeUnusedBufferCopies(void);
void _freeUnusedBufferCopies(void);

/** Internal method for releasing all temporary buffers which have been
allocated using BLT_AUTOMATIC_RELEASE; is called by OGRE.
Expand All @@ -387,7 +381,7 @@ namespace Ogre {
If @c false, auto detect and free all unused temporary buffers based on
temporary buffers utilization.
*/
virtual void _releaseBufferCopies(bool forceFreeUnused = false);
void _releaseBufferCopies(bool forceFreeUnused = false);

/** Internal method that forces the release of copies of a given buffer.
@remarks
Expand All @@ -399,7 +393,7 @@ namespace Ogre {
The source buffer as a shared pointer. Any buffer copies created
from the source buffer are deleted.
*/
virtual void _forceReleaseBufferCopies(const HardwareVertexBufferSharedPtr& sourceBuffer);
void _forceReleaseBufferCopies(const HardwareVertexBufferSharedPtr& sourceBuffer);

/** Internal method that forces the release of copies of a given buffer.
@remarks
Expand All @@ -411,7 +405,7 @@ namespace Ogre {
The source buffer as a pointer. Any buffer copies created from
the source buffer are deleted.
*/
virtual void _forceReleaseBufferCopies(HardwareVertexBuffer* sourceBuffer);
void _forceReleaseBufferCopies(HardwareVertexBuffer* sourceBuffer);

/// Notification that a hardware vertex buffer has been destroyed.
void _notifyVertexBufferDestroyed(HardwareVertexBuffer* buf);
Expand All @@ -426,139 +420,10 @@ namespace Ogre {
/** Singleton wrapper for hardware buffer manager. */
class _OgreExport HardwareBufferManager : public HardwareBufferManagerBase, public Singleton<HardwareBufferManager>
{
protected:
HardwareBufferManagerBase* mImpl;
public:
HardwareBufferManager(HardwareBufferManagerBase* imp);
HardwareBufferManager();
~HardwareBufferManager();

/** @copydoc HardwareBufferManagerBase::createVertexBuffer */
HardwareVertexBufferSharedPtr
createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage,
bool useShadowBuffer = false)
{
return mImpl->createVertexBuffer(vertexSize, numVerts, usage, useShadowBuffer);
}
/** @copydoc HardwareBufferManagerBase::createIndexBuffer */
HardwareIndexBufferSharedPtr
createIndexBuffer(HardwareIndexBuffer::IndexType itype, size_t numIndexes,
HardwareBuffer::Usage usage, bool useShadowBuffer = false)
{
return mImpl->createIndexBuffer(itype, numIndexes, usage, useShadowBuffer);
}

/** @copydoc HardwareBufferManagerBase::createRenderToVertexBuffer */
RenderToVertexBufferSharedPtr createRenderToVertexBuffer()
{
return mImpl->createRenderToVertexBuffer();
}

/** @copydoc HardwareBufferManagerBase::createUniformBuffer */
HardwareUniformBufferSharedPtr
createUniformBuffer(size_t sizeBytes, HardwareBuffer::Usage usage, bool useShadowBuffer, const String& name = "")
{
return mImpl->createUniformBuffer(sizeBytes, usage, useShadowBuffer, name);
}

/** @copydoc HardwareBufferManagerBase::createCounterBuffer */
HardwareCounterBufferSharedPtr
createCounterBuffer(size_t sizeBytes, HardwareBuffer::Usage usage, bool useShadowBuffer, const String& name = "")
{
return mImpl->createCounterBuffer(sizeBytes, usage, useShadowBuffer, name);
}

virtual VertexDeclaration* createVertexDeclaration(void)
{
return mImpl->createVertexDeclaration();
}
/** @copydoc HardwareBufferManagerBase::destroyVertexDeclaration */
virtual void destroyVertexDeclaration(VertexDeclaration* decl)
{
mImpl->destroyVertexDeclaration(decl);
}

/** @copydoc HardwareBufferManagerBase::createVertexBufferBinding */
virtual VertexBufferBinding* createVertexBufferBinding(void)
{
return mImpl->createVertexBufferBinding();
}
/** @copydoc HardwareBufferManagerBase::destroyVertexBufferBinding */
virtual void destroyVertexBufferBinding(VertexBufferBinding* binding)
{
mImpl->destroyVertexBufferBinding(binding);
}
/** @copydoc HardwareBufferManagerBase::registerVertexBufferSourceAndCopy */
virtual void registerVertexBufferSourceAndCopy(
const HardwareVertexBufferSharedPtr& sourceBuffer,
const HardwareVertexBufferSharedPtr& copy)
{
mImpl->registerVertexBufferSourceAndCopy(sourceBuffer, copy);
}
/** @copydoc HardwareBufferManagerBase::allocateVertexBufferCopy */
virtual HardwareVertexBufferSharedPtr allocateVertexBufferCopy(
const HardwareVertexBufferSharedPtr& sourceBuffer,
BufferLicenseType licenseType,
HardwareBufferLicensee* licensee,
bool copyData = false)
{
return mImpl->allocateVertexBufferCopy(sourceBuffer, licenseType, licensee, copyData);
}
/** @copydoc HardwareBufferManagerBase::releaseVertexBufferCopy */
virtual void releaseVertexBufferCopy(
const HardwareVertexBufferSharedPtr& bufferCopy)
{
mImpl->releaseVertexBufferCopy(bufferCopy);
}

/** @copydoc HardwareBufferManagerBase::touchVertexBufferCopy */
virtual void touchVertexBufferCopy(
const HardwareVertexBufferSharedPtr& bufferCopy)
{
mImpl->touchVertexBufferCopy(bufferCopy);
}

/** @copydoc HardwareBufferManagerBase::_freeUnusedBufferCopies */
virtual void _freeUnusedBufferCopies(void)
{
mImpl->_freeUnusedBufferCopies();
}
/** @copydoc HardwareBufferManagerBase::_releaseBufferCopies */
virtual void _releaseBufferCopies(bool forceFreeUnused = false)
{
mImpl->_releaseBufferCopies(forceFreeUnused);
}
/** @copydoc HardwareBufferManagerBase::_forceReleaseBufferCopies */
virtual void _forceReleaseBufferCopies(
const HardwareVertexBufferSharedPtr& sourceBuffer)
{
mImpl->_forceReleaseBufferCopies(sourceBuffer);
}
/** @copydoc HardwareBufferManagerBase::_forceReleaseBufferCopies */
virtual void _forceReleaseBufferCopies(HardwareVertexBuffer* sourceBuffer)
{
mImpl->_forceReleaseBufferCopies(sourceBuffer);
}
/** @copydoc HardwareBufferManagerBase::_notifyVertexBufferDestroyed */
void _notifyVertexBufferDestroyed(HardwareVertexBuffer* buf)
{
mImpl->_notifyVertexBufferDestroyed(buf);
}
/** @copydoc HardwareBufferManagerBase::_notifyIndexBufferDestroyed */
void _notifyIndexBufferDestroyed(HardwareIndexBuffer* buf)
{
mImpl->_notifyIndexBufferDestroyed(buf);
}
/** @copydoc HardwareBufferManagerBase::_notifyUniformBufferDestroyed */
void _notifyUniformBufferDestroyed(HardwareUniformBuffer* buf)
{
mImpl->_notifyUniformBufferDestroyed(buf);
}
/** @copydoc HardwareBufferManagerBase::_notifyCounterBufferDestroyed */
void _notifyConterBufferDestroyed(HardwareCounterBuffer* buf)
{
mImpl->_notifyCounterBufferDestroyed(buf);
}

/// @copydoc Singleton::getSingleton()
static HardwareBufferManager& getSingleton(void);
/// @copydoc Singleton::getSingleton()
Expand Down
5 changes: 1 addition & 4 deletions OgreMain/src/OgreHardwareBufferManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,12 @@ namespace Ogre {
assert( msSingleton ); return ( *msSingleton );
}
//---------------------------------------------------------------------
HardwareBufferManager::HardwareBufferManager(HardwareBufferManagerBase* imp)
: HardwareBufferManagerBase(), mImpl(imp)
HardwareBufferManager::HardwareBufferManager()
{

}
//---------------------------------------------------------------------
HardwareBufferManager::~HardwareBufferManager()
{
// mImpl must be deleted by the creator
}
//---------------------------------------------------------------------
//---------------------------------------------------------------------
Expand Down
23 changes: 4 additions & 19 deletions RenderSystems/Direct3D11/include/OgreD3D11HardwareBufferManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ THE SOFTWARE.
namespace Ogre {

/** Implementation of HardwareBufferManager for D3D11. */
class _OgreD3D11Export D3D11HardwareBufferManagerBase : public HardwareBufferManagerBase
class _OgreD3D11Export D3D11HardwareBufferManager : public HardwareBufferManager
{
protected:
D3D11Device & mlpD3DDevice;
Expand All @@ -45,8 +45,8 @@ namespace Ogre {
void destroyVertexDeclarationImpl(VertexDeclaration* decl);

public:
D3D11HardwareBufferManagerBase(D3D11Device & device);
~D3D11HardwareBufferManagerBase();
D3D11HardwareBufferManager(D3D11Device & device);
~D3D11HardwareBufferManager();
/// Creates a vertex buffer
HardwareVertexBufferSharedPtr
createVertexBuffer(size_t vertexSize, size_t numVerts, HardwareBuffer::Usage usage, bool useShadowBuffer = false);
Expand All @@ -68,22 +68,7 @@ namespace Ogre {
bool useShadowBuffer = false, const String& name = "");
};

/// D3D11HardwareBufferManagerBase as a Singleton
class _OgreD3D11Export D3D11HardwareBufferManager : public HardwareBufferManager
{
public:
D3D11HardwareBufferManager(D3D11Device & device)
: HardwareBufferManager(OGRE_NEW D3D11HardwareBufferManagerBase(device))
{

}
~D3D11HardwareBufferManager()
{
OGRE_DELETE mImpl;
}
};


typedef D3D11HardwareBufferManager D3D11HardwareBufferManagerBase;
}


Expand Down
Loading

0 comments on commit 49dfbfe

Please sign in to comment.