mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-24 06:36:08 +00:00
Protect against invalid values in view desc for number of mips
* This is mostly relevant for D3D12, where the desc comes from the user and so may not be normalised and contain values like 0xffffffff to indicate 'all mips' or 'all slices' in the view.
This commit is contained in:
@@ -756,6 +756,14 @@ ShaderVariable D3D11DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
result.value.u32v[3] =
|
||||
isarray ? srvDesc.Texture1DArray.MipLevels : srvDesc.Texture1D.MipLevels;
|
||||
|
||||
if(isarray && (result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U))
|
||||
result.value.u32v[2] = desc.ArraySize;
|
||||
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = desc.MipLevels;
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = CalcNumMips(desc.Width, 1, 1);
|
||||
|
||||
if(mipLevel >= result.value.u32v[3])
|
||||
result.value.u32v[0] = result.value.u32v[1] = 0;
|
||||
|
||||
@@ -789,6 +797,9 @@ ShaderVariable D3D11DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
{
|
||||
result.value.u32v[2] = srvDesc.Texture2DArray.ArraySize;
|
||||
result.value.u32v[3] = srvDesc.Texture2DArray.MipLevels;
|
||||
|
||||
if(result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U)
|
||||
result.value.u32v[2] = desc.ArraySize;
|
||||
}
|
||||
else if(srvDesc.ViewDimension == D3D11_SRV_DIMENSION_TEXTURE2DMS)
|
||||
{
|
||||
@@ -799,8 +810,16 @@ ShaderVariable D3D11DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
{
|
||||
result.value.u32v[2] = srvDesc.Texture2DMSArray.ArraySize;
|
||||
result.value.u32v[3] = 1;
|
||||
|
||||
if(result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U)
|
||||
result.value.u32v[2] = desc.ArraySize;
|
||||
}
|
||||
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = desc.MipLevels;
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = CalcNumMips(desc.Width, desc.Height, 1);
|
||||
|
||||
if(mipLevel >= result.value.u32v[3])
|
||||
result.value.u32v[0] = result.value.u32v[1] = result.value.u32v[2] = 0;
|
||||
|
||||
@@ -824,6 +843,11 @@ ShaderVariable D3D11DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
result.value.u32v[2] = RDCMAX(1U, desc.Depth >> mipLevel);
|
||||
result.value.u32v[3] = srvDesc.Texture3D.MipLevels;
|
||||
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = desc.MipLevels;
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = CalcNumMips(desc.Width, desc.Height, desc.Depth);
|
||||
|
||||
if(mipLevel >= result.value.u32v[3])
|
||||
result.value.u32v[0] = result.value.u32v[1] = result.value.u32v[2] = 0;
|
||||
|
||||
@@ -855,6 +879,14 @@ ShaderVariable D3D11DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
result.value.u32v[3] =
|
||||
isarray ? srvDesc.TextureCubeArray.MipLevels : srvDesc.TextureCube.MipLevels;
|
||||
|
||||
if(isarray && (result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U))
|
||||
result.value.u32v[2] = desc.ArraySize;
|
||||
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = desc.MipLevels;
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = CalcNumMips(desc.Width, desc.Height, 1);
|
||||
|
||||
if(mipLevel >= result.value.u32v[3])
|
||||
result.value.u32v[0] = result.value.u32v[1] = result.value.u32v[2] = 0;
|
||||
|
||||
@@ -916,6 +948,9 @@ ShaderVariable D3D11DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
result.value.u32v[1] = isarray ? uavDesc.Texture1DArray.ArraySize : 0;
|
||||
result.value.u32v[2] = 0;
|
||||
|
||||
if(isarray && (result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U))
|
||||
result.value.u32v[2] = desc.ArraySize;
|
||||
|
||||
// spec says "For UAVs (u#), the number of mip levels is always 1."
|
||||
result.value.u32v[3] = 1;
|
||||
|
||||
@@ -942,10 +977,17 @@ ShaderVariable D3D11DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
result.value.u32v[1] = RDCMAX(1U, desc.Height >> mipLevel);
|
||||
|
||||
if(uavDesc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE2D)
|
||||
{
|
||||
result.value.u32v[2] = 0;
|
||||
}
|
||||
else if(uavDesc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE2DARRAY)
|
||||
{
|
||||
result.value.u32v[2] = uavDesc.Texture2DArray.ArraySize;
|
||||
|
||||
if(result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U)
|
||||
result.value.u32v[2] = desc.ArraySize;
|
||||
}
|
||||
|
||||
// spec says "For UAVs (u#), the number of mip levels is always 1."
|
||||
result.value.u32v[3] = 1;
|
||||
|
||||
|
||||
@@ -962,6 +962,14 @@ ShaderVariable D3D12DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
result.value.u32v[3] =
|
||||
isarray ? srvDesc.Texture1DArray.MipLevels : srvDesc.Texture1D.MipLevels;
|
||||
|
||||
if(isarray && (result.value.u32v[1] == 0 || result.value.u32v[1] == ~0U))
|
||||
result.value.u32v[1] = resDesc.DepthOrArraySize;
|
||||
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = resDesc.MipLevels;
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = CalcNumMips((int)resDesc.Width, resDesc.Height, 1);
|
||||
|
||||
if(mipLevel >= result.value.u32v[3])
|
||||
result.value.u32v[0] = result.value.u32v[1] = 0;
|
||||
|
||||
@@ -985,6 +993,9 @@ ShaderVariable D3D12DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
{
|
||||
result.value.u32v[2] = srvDesc.Texture2DArray.ArraySize;
|
||||
result.value.u32v[3] = srvDesc.Texture2DArray.MipLevels;
|
||||
|
||||
if(result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U)
|
||||
result.value.u32v[2] = resDesc.DepthOrArraySize;
|
||||
}
|
||||
else if(srvDesc.ViewDimension == D3D12_SRV_DIMENSION_TEXTURE2DMS)
|
||||
{
|
||||
@@ -995,7 +1006,16 @@ ShaderVariable D3D12DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
{
|
||||
result.value.u32v[2] = srvDesc.Texture2DMSArray.ArraySize;
|
||||
result.value.u32v[3] = 1;
|
||||
|
||||
if(result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U)
|
||||
result.value.u32v[2] = resDesc.DepthOrArraySize;
|
||||
}
|
||||
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = resDesc.MipLevels;
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = CalcNumMips((int)resDesc.Width, resDesc.Height, 1);
|
||||
|
||||
if(mipLevel >= result.value.u32v[3])
|
||||
result.value.u32v[0] = result.value.u32v[1] = result.value.u32v[2] = 0;
|
||||
|
||||
@@ -1010,6 +1030,12 @@ ShaderVariable D3D12DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
result.value.u32v[2] = RDCMAX(1U, (uint32_t)(resDesc.DepthOrArraySize >> mipLevel));
|
||||
result.value.u32v[3] = srvDesc.Texture3D.MipLevels;
|
||||
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = resDesc.MipLevels;
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] =
|
||||
CalcNumMips((int)resDesc.Width, resDesc.Height, resDesc.DepthOrArraySize);
|
||||
|
||||
if(mipLevel >= result.value.u32v[3])
|
||||
result.value.u32v[0] = result.value.u32v[1] = result.value.u32v[2] = 0;
|
||||
|
||||
@@ -1034,6 +1060,14 @@ ShaderVariable D3D12DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
|
||||
result.value.u32v[3] =
|
||||
isarray ? srvDesc.TextureCubeArray.MipLevels : srvDesc.TextureCube.MipLevels;
|
||||
|
||||
if(result.value.u32v[2] == 0 || result.value.u32v[2] == ~0U)
|
||||
result.value.u32v[2] = resDesc.DepthOrArraySize / 6;
|
||||
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = resDesc.MipLevels;
|
||||
if(result.value.u32v[3] == 0 || result.value.u32v[3] == ~0U)
|
||||
result.value.u32v[3] = CalcNumMips((int)resDesc.Width, resDesc.Height, 1);
|
||||
|
||||
if(mipLevel >= result.value.u32v[3])
|
||||
result.value.u32v[0] = result.value.u32v[1] = result.value.u32v[2] = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user