Skip to content

Commit 5e2f7cf

Browse files
committed
D3D11: properly use HBU setting instead of abusing systemMemory flag
1 parent 681bff1 commit 5e2f7cf

8 files changed

+24
-27
lines changed

RenderSystems/Direct3D11/include/OgreD3D11HardwareBuffer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ namespace Ogre {
6464

6565
public:
6666
D3D11HardwareBuffer(BufferType btype, size_t sizeBytes, HardwareBuffer::Usage usage,
67-
D3D11Device & device, bool useSystemMem, bool useShadowBuffer, bool streamOut);
67+
D3D11Device & device, bool useShadowBuffer, bool streamOut);
6868
~D3D11HardwareBuffer();
6969
/** See HardwareBuffer. */
7070
void readData(size_t offset, size_t length, void* pDest);

RenderSystems/Direct3D11/include/OgreD3D11HardwareIndexBuffer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace Ogre {
4444

4545
public:
4646
D3D11HardwareIndexBuffer(HardwareBufferManagerBase* mgr, IndexType idxType, size_t numIndexes,
47-
HardwareBuffer::Usage usage, D3D11Device & device, bool useSystemMem, bool useShadowBuffer);
47+
HardwareBuffer::Usage usage, D3D11Device & device, bool useShadowBuffer);
4848
~D3D11HardwareIndexBuffer();
4949

5050
// override all data-gathering methods

RenderSystems/Direct3D11/include/OgreD3D11HardwareVertexBuffer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace Ogre {
4444

4545
public:
4646
D3D11HardwareVertexBuffer(HardwareBufferManagerBase* mgr, size_t vertexSize, size_t numVertices,
47-
HardwareBuffer::Usage usage, D3D11Device & device, bool useSystemMem, bool useShadowBuffer,
47+
HardwareBuffer::Usage usage, D3D11Device & device, bool useShadowBuffer,
4848
bool streamOut);
4949
~D3D11HardwareVertexBuffer();
5050

RenderSystems/Direct3D11/src/OgreD3D11HardwareBuffer.cpp

+11-14
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,19 @@ namespace Ogre {
3535
D3D11HardwareBuffer::D3D11HardwareBuffer(
3636
BufferType btype, size_t sizeBytes,
3737
HardwareBuffer::Usage usage, D3D11Device & device,
38-
bool useSystemMemory, bool useShadowBuffer, bool streamOut)
39-
: HardwareBuffer(usage, useSystemMemory, useShadowBuffer),
38+
bool useShadowBuffer, bool streamOut)
39+
: HardwareBuffer(usage, false, useShadowBuffer),
4040
mpTempStagingBuffer(0),
4141
mUseTempStagingBuffer(false),
4242
mBufferType(btype),
4343
mDevice(device)
4444
{
4545
mSizeInBytes = sizeBytes;
4646
mDesc.ByteWidth = static_cast<UINT>(sizeBytes);
47-
mDesc.CPUAccessFlags = D3D11Mappings::_getAccessFlags(mUsage);
47+
mDesc.CPUAccessFlags = 0;
4848
mDesc.MiscFlags = 0;
4949

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

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

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

9795
}
@@ -113,8 +111,7 @@ namespace Ogre {
113111
}
114112

115113

116-
if (mSystemMemory ||
117-
(mUsage & HardwareBuffer::HBU_DYNAMIC &&
114+
if (mUsage == HBU_CPU_ONLY || (mUsage & HardwareBuffer::HBU_DYNAMIC &&
118115
(options == HardwareBuffer::HBL_DISCARD || options == HardwareBuffer::HBL_NO_OVERWRITE)))
119116
{
120117
// Staging (system memory) buffers or dynamic, write-only buffers
@@ -129,12 +126,12 @@ namespace Ogre {
129126
{
130127
case HBL_DISCARD:
131128
// To use D3D11_MAP_WRITE_DISCARD resource must have been created with write access and dynamic usage.
132-
mapType = mSystemMemory ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_DISCARD;
129+
mapType = mUsage == HBU_CPU_ONLY ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_DISCARD;
133130
break;
134131
case HBL_NO_OVERWRITE:
135132
// To use D3D11_MAP_WRITE_NO_OVERWRITE resource must have been created with write access.
136-
// TODO: check (mSystemMemory aka D3D11_USAGE_STAGING => D3D11_MAP_WRITE_NO_OVERWRITE) combo - it`s not forbidden by MSDN
137-
mapType = mSystemMemory ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_NO_OVERWRITE;
133+
// TODO: check (D3D11_USAGE_STAGING => D3D11_MAP_WRITE_NO_OVERWRITE) combo - it`s not forbidden by MSDN
134+
mapType = mUsage == HBU_CPU_ONLY ? D3D11_MAP_WRITE : D3D11_MAP_WRITE_NO_OVERWRITE;
138135
break;
139136
case HBL_NORMAL:
140137
mapType = (mDesc.CPUAccessFlags & D3D11_CPU_ACCESS_READ) ? D3D11_MAP_READ_WRITE : D3D11_MAP_WRITE;
@@ -164,7 +161,7 @@ namespace Ogre {
164161
{
165162
// create another buffer instance but use system memory
166163
mpTempStagingBuffer = new D3D11HardwareBuffer(mBufferType,
167-
mSizeInBytes, mUsage, mDevice, true, false, false);
164+
mSizeInBytes, HBU_CPU_ONLY, mDevice, false, false);
168165
}
169166

170167
// schedule a copy to the staging

RenderSystems/Direct3D11/src/OgreD3D11HardwareBufferManager.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ namespace Ogre {
5555
{
5656
assert(numVerts > 0);
5757
D3D11HardwareVertexBuffer* vbuf = new D3D11HardwareVertexBuffer(
58-
this, vertexSize, numVerts, usage, mlpD3DDevice, false, useShadowBuffer, false);
58+
this, vertexSize, numVerts, usage, mlpD3DDevice, useShadowBuffer, false);
5959
{
6060
OGRE_LOCK_MUTEX(mVertexBuffersMutex);
6161
mVertexBuffers.insert(vbuf);
@@ -70,7 +70,7 @@ namespace Ogre {
7070
{
7171
assert(numVerts > 0);
7272
D3D11HardwareVertexBuffer* vbuf = new D3D11HardwareVertexBuffer(
73-
this, vertexSize, numVerts, usage, mlpD3DDevice, false, useShadowBuffer, true);
73+
this, vertexSize, numVerts, usage, mlpD3DDevice, useShadowBuffer, true);
7474
{
7575
OGRE_LOCK_MUTEX(mVertexBuffersMutex);
7676
mVertexBuffers.insert(vbuf);
@@ -85,7 +85,7 @@ namespace Ogre {
8585
{
8686
assert(numIndexes > 0);
8787
D3D11HardwareIndexBuffer* idx = new D3D11HardwareIndexBuffer(
88-
this, itype, numIndexes, usage, mlpD3DDevice, false, useShadowBuffer);
88+
this, itype, numIndexes, usage, mlpD3DDevice, useShadowBuffer);
8989
{
9090
OGRE_LOCK_MUTEX(mIndexBuffersMutex);
9191
mIndexBuffers.insert(idx);

RenderSystems/Direct3D11/src/OgreD3D11HardwareIndexBuffer.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ namespace Ogre {
3333
//---------------------------------------------------------------------
3434
D3D11HardwareIndexBuffer::D3D11HardwareIndexBuffer(HardwareBufferManagerBase* mgr, HardwareIndexBuffer::IndexType idxType,
3535
size_t numIndexes, HardwareBuffer::Usage usage, D3D11Device & device,
36-
bool useSystemMemory, bool useShadowBuffer)
37-
: HardwareIndexBuffer(mgr, idxType, numIndexes, usage, useSystemMemory, false /* see below */)
36+
bool useShadowBuffer)
37+
: HardwareIndexBuffer(mgr, idxType, numIndexes, usage, false, false /* see below */)
3838
{
3939
// ensure DefaultHardwareIndexBuffer was not created
4040
assert(!mShadowBuffer);
4141
mUseShadowBuffer = useShadowBuffer;
4242

4343
// everything is done via internal generalisation
4444
mBufferImpl = new D3D11HardwareBuffer(D3D11HardwareBuffer::INDEX_BUFFER,
45-
mSizeInBytes, mUsage, device, useSystemMemory, useShadowBuffer, false);
45+
mSizeInBytes, mUsage, device, useShadowBuffer, false);
4646

4747
}
4848
//---------------------------------------------------------------------

RenderSystems/Direct3D11/src/OgreD3D11HardwareUniformBuffer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace Ogre {
4444

4545
// everything is done via internal generalisation
4646
mBufferImpl = new D3D11HardwareBuffer(D3D11HardwareBuffer::CONSTANT_BUFFER,
47-
mSizeInBytes, mUsage, device, false, useShadowBuffer, false);
47+
mSizeInBytes, mUsage, device, useShadowBuffer, false);
4848

4949
}
5050
//---------------------------------------------------------------------

RenderSystems/Direct3D11/src/OgreD3D11HardwareVertexBuffer.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ namespace Ogre {
3434
//---------------------------------------------------------------------
3535
D3D11HardwareVertexBuffer::D3D11HardwareVertexBuffer(HardwareBufferManagerBase* mgr, size_t vertexSize,
3636
size_t numVertices, HardwareBuffer::Usage usage, D3D11Device & device,
37-
bool useSystemMemory, bool useShadowBuffer, bool streamOut)
38-
: HardwareVertexBuffer(mgr, vertexSize, numVertices, usage, useSystemMemory, false /* see below */),
37+
bool useShadowBuffer, bool streamOut)
38+
: HardwareVertexBuffer(mgr, vertexSize, numVertices, usage, false, false /* see below */),
3939
mBufferImpl(0)
4040

4141
{
@@ -45,7 +45,7 @@ namespace Ogre {
4545

4646
// everything is done via internal generalisation
4747
mBufferImpl = new D3D11HardwareBuffer(D3D11HardwareBuffer::VERTEX_BUFFER,
48-
mSizeInBytes, mUsage, device, useSystemMemory, useShadowBuffer, streamOut);
48+
mSizeInBytes, mUsage, device, useShadowBuffer, streamOut);
4949

5050
}
5151
//---------------------------------------------------------------------

0 commit comments

Comments
 (0)