Create a default SRV/UAV descriptor when needed. Closes #2040

* In D3D12 if the user passes NULL for the UAV or SRV descriptor when calling
  Create*View we don't have the runtime to generate a default one for us when we
  query, we'll just have nothing stored. So instead when we need to generate a
  default "whole resource" descriptor to look up.
This commit is contained in:
baldurk
2020-09-04 23:23:31 +01:00
parent a2fa98becd
commit fb3c293621
4 changed files with 131 additions and 0 deletions
+6
View File
@@ -746,6 +746,9 @@ void D3D12Replay::FillResourceView(D3D12Pipe::View &view, const D3D12Descriptor
{
D3D12_SHADER_RESOURCE_VIEW_DESC srv = desc->GetSRV();
if(srv.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN)
srv = MakeSRVDesc(res);
fmt = srv.Format;
view.type = MakeTextureDim(srv.ViewDimension);
@@ -830,6 +833,9 @@ void D3D12Replay::FillResourceView(D3D12Pipe::View &view, const D3D12Descriptor
{
D3D12_UNORDERED_ACCESS_VIEW_DESC uav = desc->GetUAV();
if(uav.ViewDimension == D3D12_UAV_DIMENSION_UNKNOWN)
uav = MakeUAVDesc(res);
fmt = uav.Format;
view.counterResourceId = rm->GetOriginalID(desc->GetCounterResourceId());
+102
View File
@@ -516,3 +516,105 @@ UINT GetSliceForRtv(const D3D12_RENDER_TARGET_VIEW_DESC &view)
default: return 0;
}
}
D3D12_SHADER_RESOURCE_VIEW_DESC MakeSRVDesc(const D3D12_RESOURCE_DESC &desc)
{
D3D12_SHADER_RESOURCE_VIEW_DESC ret = {};
ret.Format = desc.Format;
ret.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
bool arrayed = desc.DepthOrArraySize > 1;
if(desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
{
// I don't think it's possible to create a SRV/SRV of a buffer with a NULL desc, but the docs
// and debug layer are quite hard to be sure. Put in something sensible.
ret.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
ret.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
ret.Buffer.StructureByteStride = 0;
ret.Buffer.FirstElement = 0;
ret.Buffer.NumElements = (UINT)desc.Width;
}
else if(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE1D)
{
ret.ViewDimension = arrayed ? D3D12_SRV_DIMENSION_TEXTURE1DARRAY : D3D12_SRV_DIMENSION_TEXTURE1D;
// shared between arrayed and not
ret.Texture1D.MipLevels = desc.MipLevels;
if(arrayed)
ret.Texture1DArray.ArraySize = desc.DepthOrArraySize;
}
else if(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D)
{
if(desc.SampleDesc.Count > 1)
{
ret.ViewDimension =
arrayed ? D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY : D3D12_SRV_DIMENSION_TEXTURE2DMS;
if(arrayed)
ret.Texture2DMSArray.ArraySize = desc.DepthOrArraySize;
}
else
{
ret.ViewDimension =
arrayed ? D3D12_SRV_DIMENSION_TEXTURE2DARRAY : D3D12_SRV_DIMENSION_TEXTURE2D;
// shared between arrayed and not
ret.Texture2D.MipLevels = desc.MipLevels;
if(arrayed)
ret.Texture2DArray.ArraySize = desc.DepthOrArraySize;
}
}
else if(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D)
{
ret.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;
ret.Texture3D.MipLevels = desc.MipLevels;
}
return ret;
}
D3D12_UNORDERED_ACCESS_VIEW_DESC MakeUAVDesc(const D3D12_RESOURCE_DESC &desc)
{
D3D12_UNORDERED_ACCESS_VIEW_DESC ret = {};
ret.Format = desc.Format;
bool arrayed = desc.DepthOrArraySize > 1;
if(desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER)
{
// I don't think it's possible to create a UAV/SRV of a buffer with a NULL desc, but the docs
// and debug layer are quite hard to be sure. Put in something sensible.
ret.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
ret.Buffer.NumElements = (UINT)desc.Width;
}
else if(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE1D)
{
ret.ViewDimension = arrayed ? D3D12_UAV_DIMENSION_TEXTURE1DARRAY : D3D12_UAV_DIMENSION_TEXTURE1D;
if(arrayed)
ret.Texture1DArray.ArraySize = desc.DepthOrArraySize;
}
else if(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D)
{
ret.ViewDimension = arrayed ? D3D12_UAV_DIMENSION_TEXTURE2DARRAY : D3D12_UAV_DIMENSION_TEXTURE2D;
if(arrayed)
ret.Texture2DArray.ArraySize = desc.DepthOrArraySize;
}
else if(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D)
{
ret.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D;
ret.Texture3D.WSize = desc.DepthOrArraySize;
}
return ret;
}
+3
View File
@@ -37,6 +37,9 @@ UINT GetSliceForDsv(const D3D12_DEPTH_STENCIL_VIEW_DESC &dsv);
UINT GetMipForRtv(const D3D12_RENDER_TARGET_VIEW_DESC &rtv);
UINT GetSliceForRtv(const D3D12_RENDER_TARGET_VIEW_DESC &rtv);
D3D12_SHADER_RESOURCE_VIEW_DESC MakeSRVDesc(const D3D12_RESOURCE_DESC &desc);
D3D12_UNORDERED_ACCESS_VIEW_DESC MakeUAVDesc(const D3D12_RESOURCE_DESC &desc);
class TrackedResource12
{
public:
@@ -215,6 +215,9 @@ bool D3D12DebugAPIWrapper::FetchSRV(const DXBCDebug::BindingSlot &slot)
ID3D12Resource *pResource = rm->GetCurrentAs<ID3D12Resource>(srvId);
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = desc->GetSRV();
if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN)
srvDesc = MakeSRVDesc(pResource->GetDesc());
if(srvDesc.Format != DXGI_FORMAT_UNKNOWN)
{
DXBCDebug::FillViewFmt(srvDesc.Format, srvData.format);
@@ -358,6 +361,10 @@ bool D3D12DebugAPIWrapper::FetchUAV(const DXBCDebug::BindingSlot &slot)
// TODO: Need to fetch counter resource if applicable
D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = desc->GetUAV();
if(uavDesc.ViewDimension == D3D12_UAV_DIMENSION_UNKNOWN)
uavDesc = MakeUAVDesc(pResource->GetDesc());
if(uavDesc.Format != DXGI_FORMAT_UNKNOWN)
{
DXBCDebug::FillViewFmt(uavDesc.Format, uavData.format);
@@ -569,6 +576,9 @@ ShaderVariable D3D12DebugAPIWrapper::GetSampleInfo(DXBCBytecode::OperandType typ
ID3D12Resource *pResource = rm->GetCurrentAs<ID3D12Resource>(srvId);
D3D12_RESOURCE_DESC resDesc = pResource->GetDesc();
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = desc->GetSRV();
if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN)
srvDesc = MakeSRVDesc(resDesc);
if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_TEXTURE2DMS ||
srvDesc.ViewDimension == D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY)
{
@@ -712,6 +722,9 @@ ShaderVariable D3D12DebugAPIWrapper::GetBufferInfo(DXBCBytecode::OperandType typ
D3D12_RESOURCE_DESC resDesc = pResource->GetDesc();
D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = desc->GetUAV();
if(uavDesc.ViewDimension == D3D12_UAV_DIMENSION_UNKNOWN)
uavDesc = MakeUAVDesc(resDesc);
if(uavDesc.ViewDimension == D3D12_UAV_DIMENSION_BUFFER)
{
result.value.u.x = result.value.u.y = result.value.u.z = result.value.u.w =
@@ -726,6 +739,8 @@ ShaderVariable D3D12DebugAPIWrapper::GetBufferInfo(DXBCBytecode::OperandType typ
ID3D12Resource *pResource = rm->GetCurrentAs<ID3D12Resource>(srvId);
D3D12_RESOURCE_DESC resDesc = pResource->GetDesc();
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = desc->GetSRV();
if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN)
srvDesc = MakeSRVDesc(resDesc);
if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_BUFFER)
{
@@ -832,6 +847,9 @@ ShaderVariable D3D12DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
D3D12_RESOURCE_DESC resDesc = pResource->GetDesc();
D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = desc->GetUAV();
if(uavDesc.ViewDimension == D3D12_UAV_DIMENSION_UNKNOWN)
uavDesc = MakeUAVDesc(resDesc);
switch(uavDesc.ViewDimension)
{
case D3D12_UAV_DIMENSION_UNKNOWN:
@@ -907,6 +925,8 @@ ShaderVariable D3D12DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
ID3D12Resource *pResource = rm->GetCurrentAs<ID3D12Resource>(srvId);
D3D12_RESOURCE_DESC resDesc = pResource->GetDesc();
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = desc->GetSRV();
if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN)
srvDesc = MakeSRVDesc(resDesc);
switch(srvDesc.ViewDimension)
{
case D3D12_SRV_DIMENSION_UNKNOWN: