Skip to content

Commit

Permalink
D3D11: properly use HBU setting instead of abusing systemMemory flag
Browse files Browse the repository at this point in the history
  • Loading branch information
paroj committed Sep 2, 2020
1 parent 681bff1 commit 5e2f7cf
Show file tree
Hide file tree
Showing 8 changed files with 24 additions and 27 deletions.
2 changes: 1 addition & 1 deletion RenderSystems/Direct3D11/include/OgreD3D11HardwareBuffer.h
Expand Up @@ -64,7 +64,7 @@ namespace Ogre {

public:
D3D11HardwareBuffer(BufferType btype, size_t sizeBytes, HardwareBuffer::Usage usage,
D3D11Device & device, bool useSystemMem, bool useShadowBuffer, bool streamOut);
D3D11Device & device, bool useShadowBuffer, bool streamOut);
~D3D11HardwareBuffer();
/** See HardwareBuffer. */
void readData(size_t offset, size_t length, void* pDest);
Expand Down
Expand Up @@ -44,7 +44,7 @@ namespace Ogre {

public:
D3D11HardwareIndexBuffer(HardwareBufferManagerBase* mgr, IndexType idxType, size_t numIndexes,
HardwareBuffer::Usage usage, D3D11Device & device, bool useSystemMem, bool useShadowBuffer);
HardwareBuffer::Usage usage, D3D11Device & device, bool useShadowBuffer);
~D3D11HardwareIndexBuffer();

// override all data-gathering methods
Expand Down
Expand Up @@ -44,7 +44,7 @@ namespace Ogre {

public:
D3D11HardwareVertexBuffer(HardwareBufferManagerBase* mgr, size_t vertexSize, size_t numVertices,
HardwareBuffer::Usage usage, D3D11Device & device, bool useSystemMem, bool useShadowBuffer,
HardwareBuffer::Usage usage, D3D11Device & device, bool useShadowBuffer,
bool streamOut);
~D3D11HardwareVertexBuffer();

Expand Down
25 changes: 11 additions & 14 deletions RenderSystems/Direct3D11/src/OgreD3D11HardwareBuffer.cpp
Expand Up @@ -35,19 +35,19 @@ namespace Ogre {
D3D11HardwareBuffer::D3D11HardwareBuffer(
BufferType btype, size_t sizeBytes,
HardwareBuffer::Usage usage, D3D11Device & device,
bool useSystemMemory, bool useShadowBuffer, bool streamOut)
: HardwareBuffer(usage, useSystemMemory, useShadowBuffer),
bool useShadowBuffer, bool streamOut)
: HardwareBuffer(usage, false, useShadowBuffer),
mpTempStagingBuffer(0),
mUseTempStagingBuffer(false),
mBufferType(btype),
mDevice(device)
{
mSizeInBytes = sizeBytes;
mDesc.ByteWidth = static_cast<UINT>(sizeBytes);
mDesc.CPUAccessFlags = D3D11Mappings::_getAccessFlags(mUsage);
mDesc.CPUAccessFlags = 0;
mDesc.MiscFlags = 0;

if (useSystemMemory)
if (usage == HBU_CPU_ONLY)
{
mDesc.Usage = D3D11_USAGE_STAGING;
//A D3D11_USAGE_STAGING Resource cannot be bound to any parts of the graphics pipeline, so therefore cannot have any BindFlags bits set.
Expand All @@ -68,7 +68,7 @@ namespace Ogre {
mDesc.BindFlags |= D3D11_BIND_STREAM_OUTPUT;
}

if (!useSystemMemory && (usage & HardwareBuffer::HBU_DYNAMIC))
if (usage == HBU_CPU_TO_GPU)
{
// We want to be able to map this buffer
mDesc.CPUAccessFlags |= D3D11_CPU_ACCESS_WRITE;
Expand All @@ -80,8 +80,6 @@ namespace Ogre {
// which themselves cannot be used for input / output to the GPU. Thus
// for any locks except write locks on dynamic resources, we have to use
// temporary staging resources instead and use async copies.
// We use the 'useSystemMemory' option to indicate a staging resource


// TODO: we can explicitly initialise the buffer contents here if we like
// not doing this since OGRE doesn't support this model yet
Expand All @@ -91,7 +89,7 @@ namespace Ogre {
if (mUseShadowBuffer)
{
mShadowBuffer.reset(new D3D11HardwareBuffer(mBufferType,
mSizeInBytes, mUsage, mDevice, true, false, false));
mSizeInBytes, HBU_CPU_ONLY, mDevice, false, false));
}

}
Expand All @@ -113,8 +111,7 @@ namespace Ogre {
}


if (mSystemMemory ||
(mUsage & HardwareBuffer::HBU_DYNAMIC &&
if (mUsage == HBU_CPU_ONLY || (mUsage & HardwareBuffer::HBU_DYNAMIC &&
(options == HardwareBuffer::HBL_DISCARD || options == HardwareBuffer::HBL_NO_OVERWRITE)))
{
// Staging (system memory) buffers or dynamic, write-only buffers
Expand All @@ -129,12 +126,12 @@ namespace Ogre {
{
case HBL_DISCARD:
// To use D3D11_MAP_WRITE_DISCARD resource must have been created with write access and dynamic usage.
mapType = mSystemMemory ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_DISCARD;
mapType = mUsage == HBU_CPU_ONLY ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_DISCARD;
break;
case HBL_NO_OVERWRITE:
// To use D3D11_MAP_WRITE_NO_OVERWRITE resource must have been created with write access.
// TODO: check (mSystemMemory aka D3D11_USAGE_STAGING => D3D11_MAP_WRITE_NO_OVERWRITE) combo - it`s not forbidden by MSDN
mapType = mSystemMemory ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_NO_OVERWRITE;
// TODO: check (D3D11_USAGE_STAGING => D3D11_MAP_WRITE_NO_OVERWRITE) combo - it`s not forbidden by MSDN
mapType = mUsage == HBU_CPU_ONLY ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_NO_OVERWRITE;
break;
case HBL_NORMAL:
mapType = (mDesc.CPUAccessFlags & D3D11_CPU_ACCESS_READ) ? D3D11_MAP_READ_WRITE : D3D11_MAP_WRITE;
Expand Down Expand Up @@ -164,7 +161,7 @@ namespace Ogre {
{
// create another buffer instance but use system memory
mpTempStagingBuffer = new D3D11HardwareBuffer(mBufferType,
mSizeInBytes, mUsage, mDevice, true, false, false);
mSizeInBytes, HBU_CPU_ONLY, mDevice, false, false);
}

// schedule a copy to the staging
Expand Down
Expand Up @@ -55,7 +55,7 @@ namespace Ogre {
{
assert(numVerts > 0);
D3D11HardwareVertexBuffer* vbuf = new D3D11HardwareVertexBuffer(
this, vertexSize, numVerts, usage, mlpD3DDevice, false, useShadowBuffer, false);
this, vertexSize, numVerts, usage, mlpD3DDevice, useShadowBuffer, false);
{
OGRE_LOCK_MUTEX(mVertexBuffersMutex);
mVertexBuffers.insert(vbuf);
Expand All @@ -70,7 +70,7 @@ namespace Ogre {
{
assert(numVerts > 0);
D3D11HardwareVertexBuffer* vbuf = new D3D11HardwareVertexBuffer(
this, vertexSize, numVerts, usage, mlpD3DDevice, false, useShadowBuffer, true);
this, vertexSize, numVerts, usage, mlpD3DDevice, useShadowBuffer, true);
{
OGRE_LOCK_MUTEX(mVertexBuffersMutex);
mVertexBuffers.insert(vbuf);
Expand All @@ -85,7 +85,7 @@ namespace Ogre {
{
assert(numIndexes > 0);
D3D11HardwareIndexBuffer* idx = new D3D11HardwareIndexBuffer(
this, itype, numIndexes, usage, mlpD3DDevice, false, useShadowBuffer);
this, itype, numIndexes, usage, mlpD3DDevice, useShadowBuffer);
{
OGRE_LOCK_MUTEX(mIndexBuffersMutex);
mIndexBuffers.insert(idx);
Expand Down
6 changes: 3 additions & 3 deletions RenderSystems/Direct3D11/src/OgreD3D11HardwareIndexBuffer.cpp
Expand Up @@ -33,16 +33,16 @@ namespace Ogre {
//---------------------------------------------------------------------
D3D11HardwareIndexBuffer::D3D11HardwareIndexBuffer(HardwareBufferManagerBase* mgr, HardwareIndexBuffer::IndexType idxType,
size_t numIndexes, HardwareBuffer::Usage usage, D3D11Device & device,
bool useSystemMemory, bool useShadowBuffer)
: HardwareIndexBuffer(mgr, idxType, numIndexes, usage, useSystemMemory, false /* see below */)
bool useShadowBuffer)
: HardwareIndexBuffer(mgr, idxType, numIndexes, usage, false, false /* see below */)
{
// ensure DefaultHardwareIndexBuffer was not created
assert(!mShadowBuffer);
mUseShadowBuffer = useShadowBuffer;

// everything is done via internal generalisation
mBufferImpl = new D3D11HardwareBuffer(D3D11HardwareBuffer::INDEX_BUFFER,
mSizeInBytes, mUsage, device, useSystemMemory, useShadowBuffer, false);
mSizeInBytes, mUsage, device, useShadowBuffer, false);

}
//---------------------------------------------------------------------
Expand Down
Expand Up @@ -44,7 +44,7 @@ namespace Ogre {

// everything is done via internal generalisation
mBufferImpl = new D3D11HardwareBuffer(D3D11HardwareBuffer::CONSTANT_BUFFER,
mSizeInBytes, mUsage, device, false, useShadowBuffer, false);
mSizeInBytes, mUsage, device, useShadowBuffer, false);

}
//---------------------------------------------------------------------
Expand Down
Expand Up @@ -34,8 +34,8 @@ namespace Ogre {
//---------------------------------------------------------------------
D3D11HardwareVertexBuffer::D3D11HardwareVertexBuffer(HardwareBufferManagerBase* mgr, size_t vertexSize,
size_t numVertices, HardwareBuffer::Usage usage, D3D11Device & device,
bool useSystemMemory, bool useShadowBuffer, bool streamOut)
: HardwareVertexBuffer(mgr, vertexSize, numVertices, usage, useSystemMemory, false /* see below */),
bool useShadowBuffer, bool streamOut)
: HardwareVertexBuffer(mgr, vertexSize, numVertices, usage, false, false /* see below */),
mBufferImpl(0)

{
Expand All @@ -45,7 +45,7 @@ namespace Ogre {

// everything is done via internal generalisation
mBufferImpl = new D3D11HardwareBuffer(D3D11HardwareBuffer::VERTEX_BUFFER,
mSizeInBytes, mUsage, device, useSystemMemory, useShadowBuffer, streamOut);
mSizeInBytes, mUsage, device, useShadowBuffer, streamOut);

}
//---------------------------------------------------------------------
Expand Down

0 comments on commit 5e2f7cf

Please sign in to comment.