Skip to content

Commit eb46da5

Browse files
committed
Main: add lightweight DefaultBuffer class for shadow buffering
1 parent 97a5231 commit eb46da5

7 files changed

+54
-7
lines changed

OgreMain/include/OgreDefaultHardwareBufferManager.h

+16
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ namespace Ogre {
4343
* @{
4444
*/
4545

46+
/// Specialisation of Buffer using malloc e.g. for use as shadow buffer
47+
class _OgreExport DefaultBuffer : public Buffer
48+
{
49+
protected:
50+
unsigned char* mData;
51+
void* lockImpl(size_t offset, size_t length, LockOptions options);
52+
void unlockImpl(void);
53+
public:
54+
explicit DefaultBuffer(size_t sizeInBytes);
55+
~DefaultBuffer();
56+
void readData(size_t offset, size_t length, void* pDest);
57+
void writeData(size_t offset, size_t length, const void* pSource, bool discardWholeBuffer = false);
58+
void* lock(size_t offset, size_t length, LockOptions options);
59+
void unlock(void);
60+
};
61+
4662
/// Specialisation of HardwareVertexBuffer for emulation
4763
class _OgreExport DefaultHardwareVertexBuffer : public HardwareVertexBuffer
4864
{

OgreMain/src/OgreDefaultHardwareBufferManager.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,39 @@ THE SOFTWARE.
2929
#include "OgreDefaultHardwareBufferManager.h"
3030

3131
namespace Ogre {
32+
DefaultBuffer::DefaultBuffer(size_t sizeInBytes)
33+
: Buffer(sizeInBytes, HBU_CPU_ONLY)
34+
{
35+
// Allocate aligned memory for better SIMD processing friendly.
36+
mData = static_cast<unsigned char*>(AlignedMemory::allocate(mSizeInBytes));
37+
}
38+
//-----------------------------------------------------------------------
39+
DefaultBuffer::~DefaultBuffer() { AlignedMemory::deallocate(mData); }
40+
//-----------------------------------------------------------------------
41+
void* DefaultBuffer::lockImpl(size_t offset, size_t length, LockOptions options) { return mData + offset; }
42+
//-----------------------------------------------------------------------
43+
void DefaultBuffer::unlockImpl() {}
44+
//-----------------------------------------------------------------------
45+
void* DefaultBuffer::lock(size_t offset, size_t length, LockOptions options)
46+
{
47+
mIsLocked = true;
48+
return mData + offset;
49+
}
50+
void DefaultBuffer::unlock(void) { mIsLocked = false; }
51+
//-----------------------------------------------------------------------
52+
void DefaultBuffer::readData(size_t offset, size_t length, void* pDest)
53+
{
54+
assert((offset + length) <= mSizeInBytes);
55+
memcpy(pDest, mData + offset, length);
56+
}
57+
//-----------------------------------------------------------------------
58+
void DefaultBuffer::writeData(size_t offset, size_t length, const void* pSource, bool discardWholeBuffer)
59+
{
60+
assert((offset + length) <= mSizeInBytes);
61+
// ignore discard, memory is not guaranteed to be zeroised
62+
memcpy(mData + offset, pSource, length);
63+
}
64+
3265

3366
DefaultHardwareVertexBuffer::DefaultHardwareVertexBuffer(size_t vertexSize, size_t numVertices,
3467
HardwareBuffer::Usage usage)

OgreMain/src/OgreHardwareIndexBuffer.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ namespace Ogre {
5656
// Create a shadow buffer if required
5757
if (mUseShadowBuffer)
5858
{
59-
mShadowBuffer.reset(new DefaultHardwareIndexBuffer(mIndexType,
60-
mNumIndexes, HardwareBuffer::HBU_DYNAMIC));
59+
mShadowBuffer.reset(new DefaultBuffer(mSizeInBytes));
6160
}
6261

6362

OgreMain/src/OgreHardwareUniformBuffer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace Ogre {
4444
// Create a shadow buffer if required
4545
if (mUseShadowBuffer)
4646
{
47-
mShadowBuffer.reset(new DefaultHardwareUniformBuffer(mMgr, sizeBytes, HardwareBuffer::HBU_DYNAMIC, false));
47+
mShadowBuffer.reset(new DefaultBuffer(sizeBytes));
4848
}
4949
}
5050

OgreMain/src/OgreHardwareVertexBuffer.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ namespace Ogre {
4848
// Create a shadow buffer if required
4949
if (mUseShadowBuffer)
5050
{
51-
mShadowBuffer.reset(new DefaultHardwareVertexBuffer(mMgr, mVertexSize,
52-
mNumVertices, HardwareBuffer::HBU_DYNAMIC));
51+
mShadowBuffer.reset(new DefaultBuffer(mSizeInBytes));
5352
}
5453

5554
}

RenderSystems/Direct3D11/include/OgreD3D11HardwareBuffer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ namespace Ogre {
7272
/** See HardwareBuffer. We perform a hardware copy here. */
7373
void copyData(HardwareBuffer& srcBuffer, size_t srcOffset,
7474
size_t dstOffset, size_t length, bool discardWholeBuffer = false);
75-
void copyDataImpl(HardwareBuffer& srcBuffer, size_t srcOffset,
75+
void copyDataImpl(Buffer& srcBuffer, size_t srcOffset,
7676
size_t dstOffset, size_t length, bool discardWholeBuffer = false);
7777
/// Updates the real buffer from the shadow buffer, if required
7878
virtual void _updateFromShadow(void);

RenderSystems/Direct3D11/src/OgreD3D11HardwareBuffer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ namespace Ogre {
196196
copyDataImpl(srcBuffer, srcOffset, dstOffset, length, discardWholeBuffer);
197197
}
198198
//---------------------------------------------------------------------
199-
void D3D11HardwareBuffer::copyDataImpl(HardwareBuffer& srcBuffer, size_t srcOffset,
199+
void D3D11HardwareBuffer::copyDataImpl(Buffer& srcBuffer, size_t srcOffset,
200200
size_t dstOffset, size_t length, bool discardWholeBuffer)
201201
{
202202
// If we're copying same-size buffers in their entirety...

0 commit comments

Comments
 (0)