62 m_ContentType{ContentType}
80 explicit operator bool()
const
87 pBuff = std::move(_pBuff);
97 explicit operator bool()
const
127 explicit operator bool()
const
140 pView = std::move(pTexView);
149 pView = std::move(pBufView);
154 template <D3D11_RESOURCE_RANGE>
163 auto* pd3d11Buff = pBuffD3D11Impl ? pBuffD3D11Impl->BufferD3D11Impl::GetD3D11Buffer() :
nullptr;
164 SetD3D11ResourceInternal<D3D11_RESOURCE_RANGE_CBV>(BindPoints, std::move(pBuffD3D11Impl), pd3d11Buff);
169 auto* pd3d11SRV = pTexView ?
static_cast<ID3D11ShaderResourceView*
>(pTexView->TextureViewD3D11Impl::GetD3D11View()) :
nullptr;
170 SetD3D11ResourceInternal<D3D11_RESOURCE_RANGE_SRV>(BindPoints, std::move(pTexView), pd3d11SRV);
175 auto* pd3d11SRV = pBuffView ?
static_cast<ID3D11ShaderResourceView*
>(pBuffView->BufferViewD3D11Impl::GetD3D11View()) :
nullptr;
176 SetD3D11ResourceInternal<D3D11_RESOURCE_RANGE_SRV>(BindPoints, std::move(pBuffView), pd3d11SRV);
181 auto* pd3d11UAV = pTexView ?
static_cast<ID3D11UnorderedAccessView*
>(pTexView->TextureViewD3D11Impl::GetD3D11View()) :
nullptr;
182 SetD3D11ResourceInternal<D3D11_RESOURCE_RANGE_UAV>(BindPoints, std::move(pTexView), pd3d11UAV);
187 auto* pd3d11UAV = pBuffView ?
static_cast<ID3D11UnorderedAccessView*
>(pBuffView->BufferViewD3D11Impl::GetD3D11View()) :
nullptr;
188 SetD3D11ResourceInternal<D3D11_RESOURCE_RANGE_UAV>(BindPoints, std::move(pBuffView), pd3d11UAV);
193 auto* pd3d11Sampler = pSampler ? pSampler->SamplerD3D11Impl::GetD3D11SamplerState() :
nullptr;
194 SetD3D11ResourceInternal<D3D11_RESOURCE_RANGE_SAMPLER>(BindPoints, pSampler, pd3d11Sampler);
198 template <D3D11_RESOURCE_RANGE ResRange>
203 const auto Offset = BindPoints[ShaderInd];
204 VERIFY(Offset < GetResourceCount<ResRange>(ShaderInd),
"Resource slot is out of range");
205 const auto ResArrays = GetConstResourceArrays<ResRange>(ShaderInd);
206 return ResArrays.first[BindPoints[ShaderInd]];
209 template <D3D11_RESOURCE_RANGE ResRange>
217 auto SrcResArrays = SrcCache.GetConstResourceArrays<ResRange>(ShaderInd);
218 auto DstResArrays = GetResourceArrays<ResRange>(ShaderInd);
220 const Uint32 CacheOffset = BindPoints[ShaderInd];
221 VERIFY(CacheOffset < GetResourceCount<ResRange>(ShaderInd),
"Index is out of range");
222 if (!SrcResArrays.first[CacheOffset])
225 DstResArrays.first[CacheOffset] = SrcResArrays.first[CacheOffset];
226 DstResArrays.second[CacheOffset] = SrcResArrays.second[CacheOffset];
228 VERIFY_EXPR(IsBound == IsResourceBound<ResRange>(BindPoints));
232 template <D3D11_RESOURCE_RANGE ResRange>
240 const bool IsBound = IsResourceBound<ResRange>(FirstShaderInd, BindPoints[FirstShaderInd]);
242 #ifdef DILIGENT_DEBUG
246 VERIFY_EXPR(IsBound == IsResourceBound<ResRange>(ShaderInd, BindPoints[ShaderInd]));
254 __forceinline
Uint32 GetCBCount (
Uint32 ShaderInd)
const {
return (m_Offsets[FirstCBOffsetIdx + ShaderInd + 1] - m_Offsets[FirstCBOffsetIdx + ShaderInd]) / (
sizeof(
CachedCB) +
sizeof(ID3D11Buffer*)); }
255 __forceinline
Uint32 GetSRVCount (
Uint32 ShaderInd)
const {
return (m_Offsets[FirstSRVOffsetIdx + ShaderInd + 1] - m_Offsets[FirstSRVOffsetIdx + ShaderInd]) / (
sizeof(
CachedResource) +
sizeof(ID3D11ShaderResourceView*)); }
256 __forceinline
Uint32 GetSamplerCount(
Uint32 ShaderInd)
const {
return (m_Offsets[FirstSamOffsetIdx + ShaderInd + 1] - m_Offsets[FirstSamOffsetIdx + ShaderInd]) / (
sizeof(
CachedSampler) +
sizeof(ID3D11SamplerState*)); }
257 __forceinline
Uint32 GetUAVCount (
Uint32 ShaderInd)
const {
return (m_Offsets[FirstUAVOffsetIdx + ShaderInd + 1] - m_Offsets[FirstUAVOffsetIdx + ShaderInd]) / (
sizeof(
CachedResource) +
sizeof(ID3D11UnorderedAccessView*));}
260 template <D3D11_RESOURCE_RANGE>
280 explicit operator bool()
const
286 template <D3D11_RESOURCE_RANGE Range>
288 typename CachedResourceTraits<Range>::D3D11ResourceType* CommittedD3D11Resources[],
291 template <D3D11_RESOURCE_RANGE Range>
293 typename CachedResourceTraits<Range>::D3D11ResourceType* CommittedD3D11Views[],
294 ID3D11Resource* CommittedD3D11Resources[],
303 template <StateTransitionMode Mode>
307 template <D3D11_RESOURCE_RANGE>
308 __forceinline
Uint32 GetResourceDataOffset(
Uint32 ShaderInd)
const;
310 template <D3D11_RESOURCE_RANGE ResRange>
311 __forceinline std::pair<typename CachedResourceTraits<ResRange>::CachedResourceType*,
312 typename CachedResourceTraits<ResRange>::D3D11ResourceType**>
313 GetResourceArrays(
Uint32 ShaderInd)
const
315 using CachedResourceType = CachedResourceTraits<ResRange>::CachedResourceType;
316 using D3D11ResourceType = CachedResourceTraits<ResRange>::D3D11ResourceType;
317 static_assert(
alignof(CachedResourceType) ==
alignof(D3D11ResourceType*),
"Alignment mismatch, pointer to D3D11 resource may not be properly aligned");
319 const auto DataOffset = GetResourceDataOffset<ResRange>(ShaderInd);
320 const auto ResCount = GetResourceCount<ResRange>(ShaderInd);
321 auto*
const pResources =
reinterpret_cast<CachedResourceType*
>(m_pResourceData.get() + DataOffset);
322 auto*
const pd3d11Resources =
reinterpret_cast<D3D11ResourceType**
>(pResources + ResCount);
323 return std::make_pair(pResources, pd3d11Resources);
326 template <D3D11_RESOURCE_RANGE ResRange>
327 __forceinline std::pair<typename CachedResourceTraits<ResRange>::CachedResourceType
const*,
328 typename CachedResourceTraits<ResRange>::D3D11ResourceType*
const*>
329 GetConstResourceArrays(
Uint32 ShaderInd)
const
331 const auto ResArrays = GetResourceArrays<ResRange>(ShaderInd);
332 return std::make_pair(ResArrays.first, ResArrays.second);
335 template <D3D11_RESOURCE_RANGE ResRange,
typename TSrcResourceType,
typename TD3D11ResourceType>
336 __forceinline
void SetD3D11ResourceInternal(
const D3D11ResourceBindPoints& BindPoints, TSrcResourceType pResource, TD3D11ResourceType* pd3d11Resource)
338 VERIFY(pResource !=
nullptr && pd3d11Resource !=
nullptr || pResource ==
nullptr && pd3d11Resource ==
nullptr,
339 "Resource and D3D11 resource must be set/unset atomically");
340 for (
auto ActiveStages = BindPoints.GetActiveStages(); ActiveStages !=
SHADER_TYPE_UNKNOWN;)
343 const Uint32 CacheOffset = BindPoints[ShaderInd];
344 VERIFY(CacheOffset < GetResourceCount<ResRange>(ShaderInd),
"Cache offset is out of range");
346 auto ResArrays = GetResourceArrays<ResRange>(ShaderInd);
347 ResArrays.first[CacheOffset].Set(pResource);
348 ResArrays.second[CacheOffset] = pd3d11Resource;
352 template <D3D11_RESOURCE_RANGE ResRange>
355 const auto ResCount = GetResourceCount<ResRange>(ShaderInd);
356 VERIFY(Offset < ResCount,
"Offset is out of range");
357 const auto ResArrays = GetConstResourceArrays<ResRange>(ShaderInd);
358 return Offset < ResCount && ResArrays.first[Offset];
362 template <StateTransitionMode Mode>
363 void TransitionResources(DeviceContextD3D11Impl& Ctx,
const ID3D11Buffer* )
const;
365 template <StateTransitionMode Mode>
366 void TransitionResources(DeviceContextD3D11Impl& Ctx,
const ID3D11ShaderResourceView* )
const;
368 template <StateTransitionMode Mode>
369 void TransitionResources(DeviceContextD3D11Impl& Ctx,
const ID3D11SamplerState* )
const;
371 template <StateTransitionMode Mode>
372 void TransitionResources(DeviceContextD3D11Impl& Ctx,
const ID3D11UnorderedAccessView* )
const;
375 using OffsetType =
Uint16;
377 static constexpr
size_t MaxAlignment =
std::max(
std::max(
std::max(
alignof(CachedCB),
alignof(CachedResource)),
alignof(CachedSampler)),
alignof(IUnknown*));
381 static constexpr
Uint32 FirstCBOffsetIdx = 0;
382 static constexpr
Uint32 FirstSRVOffsetIdx = FirstCBOffsetIdx + NumShaderTypes;
383 static constexpr
Uint32 FirstSamOffsetIdx = FirstSRVOffsetIdx + NumShaderTypes;
384 static constexpr
Uint32 FirstUAVOffsetIdx = FirstSamOffsetIdx + NumShaderTypes;
385 static constexpr
Uint32 MaxOffsets = FirstUAVOffsetIdx + NumShaderTypes + 1;
387 std::array<OffsetType, MaxOffsets> m_Offsets = {};
389 bool m_IsInitialized =
false;
394 std::unique_ptr<Uint8, STDDeleter<Uint8, IMemoryAllocator>> m_pResourceData;
397 static constexpr
size_t ResCacheSize =
sizeof(ShaderResourceCacheD3D11);
430 __forceinline
Uint32 ShaderResourceCacheD3D11::GetResourceCount<D3D11_RESOURCE_RANGE_CBV>(
Uint32 ShaderInd)
const
436 __forceinline
Uint32 ShaderResourceCacheD3D11::GetResourceCount<D3D11_RESOURCE_RANGE_SRV>(
Uint32 ShaderInd)
const
442 __forceinline
Uint32 ShaderResourceCacheD3D11::GetResourceCount<D3D11_RESOURCE_RANGE_UAV>(
Uint32 ShaderInd)
const
448 __forceinline
Uint32 ShaderResourceCacheD3D11::GetResourceCount<D3D11_RESOURCE_RANGE_SAMPLER>(
Uint32 ShaderInd)
const
455 __forceinline
Uint32 ShaderResourceCacheD3D11::GetResourceDataOffset<D3D11_RESOURCE_RANGE_CBV>(
Uint32 ShaderInd)
const
457 return m_Offsets[FirstCBOffsetIdx + ShaderInd];
461 __forceinline
Uint32 ShaderResourceCacheD3D11::GetResourceDataOffset<D3D11_RESOURCE_RANGE_SRV>(
Uint32 ShaderInd)
const
463 return m_Offsets[FirstSRVOffsetIdx + ShaderInd];
467 __forceinline
Uint32 ShaderResourceCacheD3D11::GetResourceDataOffset<D3D11_RESOURCE_RANGE_SAMPLER>(
Uint32 ShaderInd)
const
469 return m_Offsets[FirstSamOffsetIdx + ShaderInd];
473 __forceinline
Uint32 ShaderResourceCacheD3D11::GetResourceDataOffset<D3D11_RESOURCE_RANGE_UAV>(
Uint32 ShaderInd)
const
475 return m_Offsets[FirstUAVOffsetIdx + ShaderInd];
479 template void ShaderResourceCacheD3D11::TransitionResourceStates<ShaderResourceCacheD3D11::StateTransitionMode::Transition>(DeviceContextD3D11Impl& Ctx);
480 template void ShaderResourceCacheD3D11::TransitionResourceStates<ShaderResourceCacheD3D11::StateTransitionMode::Verify>(DeviceContextD3D11Impl& Ctx);
482 template <D3D11_RESOURCE_RANGE Range>
488 const auto ResCount = GetResourceCount<Range>(ShaderInd);
489 const auto ResArrays = GetConstResourceArrays<Range>(ShaderInd);
490 const Uint32 BaseBinding = BaseBindings[Range][ShaderInd];
493 for (
Uint32 res = 0; res < ResCount; ++res)
495 const Uint32 Slot = BaseBinding + res;
496 if (CommittedD3D11Resources[Slot] != ResArrays.second[res])
500 CommittedD3D11Resources[Slot] = ResArrays.second[res];
507 template <D3D11_RESOURCE_RANGE Range>
511 ID3D11Resource* CommittedD3D11Resources[],
514 const auto ResCount = GetResourceCount<Range>(ShaderInd);
515 const auto ResArrays = GetConstResourceArrays<Range>(ShaderInd);
516 const Uint32 BaseBinding = BaseBindings[Range][ShaderInd];
519 for (
Uint32 res = 0; res < ResCount; ++res)
521 const Uint32 Slot = BaseBinding + res;
522 if (CommittedD3D11Views[Slot] != ResArrays.second[res])
526 CommittedD3D11Resources[Slot] = ResArrays.first[res].pd3d11Resource;
527 CommittedD3D11Views[Slot] = ResArrays.second[res];