Skip to content

Commit b822f43

Browse files
DynamicBuffer: ensure that the page size is at least 64 Kb
1 parent 953c6a4 commit b822f43

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

Graphics/GraphicsTools/src/DynamicBuffer.cpp

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ bool VerifySparseBufferCompatibility(IRenderDevice* pDevice)
4343
{
4444
VERIFY_EXPR(pDevice != nullptr);
4545

46-
const auto& DeviceInfo = pDevice->GetDeviceInfo().Features;
47-
if (!DeviceInfo.SparseResources)
46+
const DeviceFeatures& Features = pDevice->GetDeviceInfo().Features;
47+
if (!Features.SparseResources)
4848
{
4949
LOG_WARNING_MESSAGE("SparseResources device feature is not enabled.");
5050
return false;
5151
}
5252

53-
const auto& SparseRes = pDevice->GetAdapterInfo().SparseResources;
53+
const SparseResourceProperties& SparseRes = pDevice->GetAdapterInfo().SparseResources;
5454
if ((SparseRes.CapFlags & SPARSE_RESOURCE_CAP_FLAG_BUFFER) == 0)
5555
{
5656
LOG_WARNING_MESSAGE("This device does not support sparse buffers.");
@@ -67,7 +67,7 @@ DynamicBuffer::DynamicBuffer(IRenderDevice* pDevice,
6767
m_Name{CI.Desc.Name != nullptr ? CI.Desc.Name : "Dynamic buffer"},
6868
m_Desc{CI.Desc},
6969
m_VirtualSize{CI.Desc.Usage == USAGE_SPARSE ? CI.VirtualSize : 0},
70-
m_MemoryPageSize{CI.MemoryPageSize}
70+
m_MemoryPageSize{std::max(CI.MemoryPageSize, 65536u)}
7171
{
7272
DEV_CHECK_ERR(CI.Desc.Usage != USAGE_SPARSE || CI.VirtualSize > 0, "Virtual size must not be 0 for sparse buffers");
7373

@@ -93,16 +93,13 @@ void DynamicBuffer::CreateSparseBuffer(IRenderDevice* pDevice)
9393
return;
9494
}
9595

96-
const auto& SparseResources = pDevice->GetAdapterInfo().SparseResources;
97-
const auto SparseMemBlockSize = SparseResources.StandardBlockSize;
98-
99-
m_MemoryPageSize = std::max(AlignUpNonPw2(m_MemoryPageSize, SparseMemBlockSize), SparseMemBlockSize);
96+
const SparseResourceProperties& SparseResources = pDevice->GetAdapterInfo().SparseResources;
10097

10198
{
102-
auto Desc = m_Desc;
99+
BufferDesc Desc = m_Desc;
103100

104-
Desc.Size = AlignUpNonPw2(m_VirtualSize, m_MemoryPageSize);
105-
auto MaxSize = AlignDownNonPw2(SparseResources.ResourceSpaceSize, m_MemoryPageSize);
101+
Desc.Size = AlignUpNonPw2(m_VirtualSize, m_MemoryPageSize);
102+
Uint64 MaxSize = AlignDownNonPw2(SparseResources.ResourceSpaceSize, m_MemoryPageSize);
106103
if (m_Desc.BindFlags & (BIND_SHADER_RESOURCE | BIND_UNORDERED_ACCESS))
107104
{
108105
VERIFY_EXPR(m_Desc.ElementByteStride != 0);
@@ -163,8 +160,8 @@ void DynamicBuffer::InitBuffer(IRenderDevice* pDevice)
163160
// NB: m_Desc.Usage may be changed by CreateSparseBuffer()
164161
if (m_Desc.Usage == USAGE_DEFAULT && m_PendingSize > 0)
165162
{
166-
auto Desc = m_Desc;
167-
Desc.Size = m_PendingSize;
163+
BufferDesc Desc = m_Desc;
164+
Desc.Size = m_PendingSize;
168165
pDevice->CreateBuffer(Desc, nullptr, &m_pBuffer);
169166
if (m_Desc.Size == 0)
170167
{
@@ -190,12 +187,12 @@ void DynamicBuffer::ResizeSparseBuffer(IDeviceContext* pContext)
190187
SparseBufferMemoryBindInfo BufferBindInfo;
191188
BufferBindInfo.pBuffer = m_pBuffer;
192189

193-
auto StartOffset = m_Desc.Size;
194-
auto EndOffset = m_PendingSize;
190+
Uint64 StartOffset = m_Desc.Size;
191+
Uint64 EndOffset = m_PendingSize;
195192
if (StartOffset > EndOffset)
196193
std::swap(StartOffset, EndOffset);
197194
VERIFY_EXPR((EndOffset - StartOffset) % m_MemoryPageSize == 0);
198-
const auto NumPages = StaticCast<Uint32>((EndOffset - StartOffset) / m_MemoryPageSize);
195+
const Uint32 NumPages = StaticCast<Uint32>((EndOffset - StartOffset) / m_MemoryPageSize);
199196

200197
std::vector<SparseBufferMemoryBindRange> Ranges;
201198
Ranges.reserve(NumPages);
@@ -254,7 +251,7 @@ void DynamicBuffer::ResizeDefaultBuffer(IDeviceContext* pContext)
254251
return;
255252

256253
VERIFY_EXPR(m_pBuffer);
257-
auto CopySize = std::min(m_pBuffer->GetDesc().Size, m_pStaleBuffer->GetDesc().Size);
254+
Uint64 CopySize = std::min(m_pBuffer->GetDesc().Size, m_pStaleBuffer->GetDesc().Size);
258255
pContext->CopyBuffer(m_pStaleBuffer, 0, RESOURCE_STATE_TRANSITION_MODE_TRANSITION,
259256
m_pBuffer, 0, CopySize, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
260257
m_pStaleBuffer.Release();

0 commit comments

Comments
 (0)