Skip to content

Commit c1efa9e

Browse files
Fix a couple more issues with pointer alignment in shader resource caches
1 parent 508eb6d commit c1efa9e

5 files changed

Lines changed: 14 additions & 11 deletions

File tree

Graphics/GraphicsEngineD3D11/src/ShaderResourceCacheD3D11.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ void ShaderResourceCacheD3D11::Initialize(const D3D11ShaderResourceCounters&
218218
ALLOCATE(MemAllocator, "Shader resource cache data buffer", Uint8, BufferSize),
219219
STDDeleter<Uint8, IMemoryAllocator>(MemAllocator) //
220220
};
221+
VERIFY((reinterpret_cast<size_t>(m_pResourceData.get()) % MaxAlignment) == 0, "Resource cache buffer is not properly aligned");
221222
memset(m_pResourceData.get(), 0, BufferSize);
222223
}
223224

Graphics/GraphicsEngineD3D12/src/ShaderResourceCacheD3D12.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,6 @@ ShaderResourceCacheD3D12::MemoryRequirements ShaderResourceCacheD3D12::GetMemory
8585
MemReqs.TotalResources += NumRootViews;
8686
MemReqs.TotalResources += NumRootConsts;
8787

88-
static_assert(sizeof(RootTable) % sizeof(void*) == 0, "sizeof(RootTable) is not aligned by the sizeof(void*)");
89-
static_assert(sizeof(Resource) % sizeof(void*) == 0, "sizeof(Resource) is not aligned by the sizeof(void*)");
90-
9188
MemReqs.NumTables = NumRootTables + NumRootViews + NumRootConsts;
9289

9390
MemReqs.TotalInlineConstantValues = 0;
@@ -134,6 +131,8 @@ size_t ShaderResourceCacheD3D12::AllocateMemory(IMemoryAllocator& MemAllocator,
134131
ALLOCATE_RAW(MemAllocator, "Memory for shader resource cache data", MemorySize),
135132
STDDeleter<void, IMemoryAllocator>(MemAllocator) //
136133
};
134+
VERIFY((reinterpret_cast<size_t>(m_pMemory.get()) % std::max(alignof(RootTable), std::max(alignof(Resource), alignof(DescriptorHeapAllocation)))) == 0,
135+
"Resource cache buffer is not properly aligned");
137136

138137
#ifdef DILIGENT_DEBUG
139138
m_DbgMemoryEnd = static_cast<Uint8*>(m_pMemory.get()) + MemorySize;

Graphics/GraphicsEngineOpenGL/src/ShaderResourceCacheGL.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,15 @@ size_t ShaderResourceCacheGL::GetRequiredMemorySize(const TResourceCount& ResCou
3939
{
4040
static_assert(std::is_same<TResourceCount, PipelineResourceSignatureGLImpl::TBindings>::value,
4141
"ShaderResourceCacheGL::TResourceCount must be the same type as PipelineResourceSignatureGLImpl::TBindings");
42+
43+
size_t MemSize = 0;
4244
// clang-format off
43-
size_t MemSize =
44-
AlignUp(sizeof(CachedUB) * ResCount[BINDING_RANGE_UNIFORM_BUFFER], alignof(CachedResourceView)) +
45-
AlignUp(sizeof(CachedResourceView) * ResCount[BINDING_RANGE_TEXTURE], alignof(CachedResourceView)) +
46-
AlignUp(sizeof(CachedResourceView) * ResCount[BINDING_RANGE_IMAGE], alignof(CachedSSBO)) +
47-
AlignUp(sizeof(CachedSSBO) * ResCount[BINDING_RANGE_STORAGE_BUFFER], alignof(Uint32)) +
48-
TotalInlineConstants * sizeof(Uint32);
45+
MemSize = AlignUp(MemSize + sizeof(CachedUB) * ResCount[BINDING_RANGE_UNIFORM_BUFFER], alignof(CachedResourceView));
46+
MemSize = AlignUp(MemSize + sizeof(CachedResourceView) * ResCount[BINDING_RANGE_TEXTURE], alignof(CachedResourceView));
47+
MemSize = AlignUp(MemSize + sizeof(CachedResourceView) * ResCount[BINDING_RANGE_IMAGE], alignof(CachedSSBO));
48+
MemSize = AlignUp(MemSize + sizeof(CachedSSBO) * ResCount[BINDING_RANGE_STORAGE_BUFFER], alignof(Uint32));
4949
// clang-format on
50+
MemSize += TotalInlineConstants * sizeof(Uint32);
5051

5152
VERIFY(MemSize < InvalidResourceOffset, "Memory size exceed the maximum allowed size.");
5253
return MemSize;
@@ -96,6 +97,7 @@ void ShaderResourceCacheGL::Initialize(const InitAttribs& Attribs)
9697
ALLOCATE(Attribs.MemAllocator, "Shader resource cache data buffer", Uint8, BufferSize),
9798
STDDeleter<Uint8, IMemoryAllocator>(Attribs.MemAllocator) //
9899
};
100+
VERIFY((reinterpret_cast<size_t>(m_pResourceData.get()) % std::max(alignof(CachedUB), std::max(alignof(CachedResourceView), alignof(CachedSSBO)))) == 0, "Resource cache buffer is not properly aligned");
99101
memset(m_pResourceData.get(), 0, BufferSize);
100102
}
101103

@@ -315,7 +317,7 @@ void ShaderResourceCacheGL::BindResources(GLContextState& GLState,
315317
{
316318
const CachedSSBO& SSBO = GetConstSSBO(ssbo);
317319
if (!SSBO.pBufferView)
318-
return;
320+
continue;
319321

320322
const BufferViewGLImpl* pBufferViewGL = SSBO.pBufferView.ConstPtr();
321323
const BufferViewDesc& ViewDesc = pBufferViewGL->GetDesc();

Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ void ShaderResourceCacheVk::InitializeSets(IMemoryAllocator& MemAllocator,
9292
ALLOCATE_RAW(MemAllocator, "Memory for shader resource cache data", MemorySize),
9393
STDDeleter<void, IMemoryAllocator>(MemAllocator) //
9494
};
95+
VERIFY((reinterpret_cast<size_t>(m_pMemory.get()) % std::max(alignof(DescriptorSet), alignof(Resource))) == 0, "Resource cache buffer is not properly aligned");
9596
memset(m_pMemory.get(), 0, MemorySize);
9697

9798
Resource* pCurrResPtr = GetFirstResourcePtr();

Graphics/GraphicsEngineWebGPU/include/ShaderResourceCacheWebGPU.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ class ShaderResourceCacheWebGPU : public ShaderResourceCacheBase
200200
#ifdef DILIGENT_DEBUG
201201
const Resource* GetFirstResourcePtr() const
202202
{
203-
return reinterpret_cast<const Resource*>(reinterpret_cast<const BindGroup*>(m_pMemory.get()) + m_NumBindGroups);
203+
return AlignUp(reinterpret_cast<const Resource*>(static_cast<const BindGroup*>(m_pMemory.get()) + m_NumBindGroups), alignof(Resource));
204204
}
205205
#endif
206206
BindGroup* GetFirstBindGroupPtr()

0 commit comments

Comments
 (0)