Skip to content

Commit cb316d7

Browse files
ResourceSignatureD3D11: implement inline constant buffers update (#672)
1 parent 43fecc0 commit cb316d7

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

Graphics/GraphicsEngineD3D11/include/PipelineResourceSignatureD3D11Impl.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ class PipelineResourceSignatureD3D11Impl final : public PipelineResourceSignatur
113113
// Make the base class method visible
114114
using TPipelineResourceSignatureBase::CopyStaticResources;
115115

116+
void UpdateInlineConstantBuffers(const ShaderResourceCacheD3D11& ResourceCache, ID3D11DeviceContext* pd3d11Ctx) const;
117+
116118
#ifdef DILIGENT_DEVELOPMENT
117119
/// Verifies committed resource using the D3D resource attributes from the PSO.
118120
bool DvpValidateCommittedResource(const D3DShaderResourceAttribs& D3DAttribs,

Graphics/GraphicsEngineD3D11/include/ShaderResourceCacheD3D11.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,17 +280,19 @@ class ShaderResourceCacheD3D11 : public ShaderResourceCacheBase
280280
Uint32 NumConstants);
281281

282282
template <D3D11_RESOURCE_RANGE ResRange>
283-
__forceinline const typename CachedResourceTraits<ResRange>::CachedResourceType& GetResource(const D3D11ResourceBindPoints& BindPoints) const
283+
__forceinline const typename CachedResourceTraits<ResRange>::CachedResourceType& GetResource(
284+
const D3D11ResourceBindPoints& BindPoints,
285+
typename CachedResourceTraits<ResRange>::D3D11ResourceType** ppd3d11Resource = nullptr) const
284286
{
285287
VERIFY(BindPoints.GetActiveStages() != SHADER_TYPE_UNKNOWN, "No active shader stage");
286288
const Int32 FirstStageInd = GetFirstShaderStageIndex(BindPoints.GetActiveStages());
287289
const Uint8 FirstStageBinding = BindPoints[FirstStageInd];
288290
VERIFY(FirstStageBinding < GetResourceCount<ResRange>(FirstStageInd), "Resource slot is out of range");
289291
const auto FirstStageResArrays = GetConstResourceArrays<ResRange>(FirstStageInd);
290292
const auto& CachedRes = FirstStageResArrays.first[FirstStageBinding];
293+
auto* pd3d11Res = FirstStageResArrays.second[FirstStageBinding];
291294
#ifdef DILIGENT_DEBUG
292295
{
293-
const auto* pd3d11Res = FirstStageResArrays.second[FirstStageBinding];
294296
for (SHADER_TYPE ActiveStages = BindPoints.GetActiveStages(); ActiveStages != SHADER_TYPE_UNKNOWN;)
295297
{
296298
const Int32 ShaderInd = ExtractFirstShaderStageIndex(ActiveStages);
@@ -300,6 +302,8 @@ class ShaderResourceCacheD3D11 : public ShaderResourceCacheBase
300302
}
301303
}
302304
#endif
305+
if (ppd3d11Resource != nullptr)
306+
*ppd3d11Resource = pd3d11Res;
303307
return CachedRes;
304308
}
305309

Graphics/GraphicsEngineD3D11/src/PipelineResourceSignatureD3D11Impl.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,30 @@ void PipelineResourceSignatureD3D11Impl::UpdateShaderResourceBindingMap(Resource
492492
}
493493
}
494494

495+
void PipelineResourceSignatureD3D11Impl::UpdateInlineConstantBuffers(const ShaderResourceCacheD3D11& ResourceCache, ID3D11DeviceContext* pd3d11Ctx) const
496+
{
497+
for (Uint32 i = 0; i < m_NumInlineConstantBuffers; ++i)
498+
{
499+
const InlineConstantBufferAttribsD3D11& InlineCBAttr = m_InlineConstantBuffers[i];
500+
501+
ID3D11Buffer* pd3d11CB = nullptr;
502+
const ShaderResourceCacheD3D11::CachedCB& InlineCB = ResourceCache.GetResource<D3D11_RESOURCE_RANGE_CBV>(InlineCBAttr.BindPoints, &pd3d11CB);
503+
VERIFY(InlineCBAttr.NumConstants * sizeof(Uint32) == InlineCB.RangeSize, "Inline constant buffer size mismatch");
504+
VERIFY(InlineCB.pInlineConstantData != nullptr, "Inline constant data pointer is null");
505+
506+
D3D11_MAPPED_SUBRESOURCE MappedData{};
507+
if (SUCCEEDED(pd3d11Ctx->Map(pd3d11CB, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedData)))
508+
{
509+
memcpy(MappedData.pData, InlineCB.pInlineConstantData, InlineCBAttr.NumConstants * sizeof(Uint32));
510+
pd3d11Ctx->Unmap(pd3d11CB, 0);
511+
}
512+
else
513+
{
514+
DEV_ERROR("Failed to map inline constant buffer");
515+
}
516+
}
517+
}
518+
495519
#ifdef DILIGENT_DEVELOPMENT
496520
bool PipelineResourceSignatureD3D11Impl::DvpValidateCommittedResource(const D3DShaderResourceAttribs& D3DAttribs,
497521
Uint32 ResIndex,

0 commit comments

Comments
 (0)