dx12 descriptor fixes

This commit is contained in:
Turanszki Janos
2020-08-06 03:09:28 +01:00
parent 598e6c9a3b
commit 9ffd737150
3 changed files with 99 additions and 37 deletions
+98 -32
View File
@@ -2736,8 +2736,8 @@ using namespace DX12_Internal;
descriptor.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
descriptor.BaseShaderRegister = desc.BindPoint;
descriptor.NumDescriptors = 1;
descriptor.RegisterSpace = 0;
descriptor.NumDescriptors = desc.BindCount;
descriptor.RegisterSpace = desc.Space;
descriptor.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
}
else
@@ -2771,8 +2771,8 @@ using namespace DX12_Internal;
break;
}
descriptor.BaseShaderRegister = desc.BindPoint;
descriptor.NumDescriptors = 1;
descriptor.RegisterSpace = 0;
descriptor.NumDescriptors = desc.BindCount;
descriptor.RegisterSpace = desc.Space;
descriptor.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
}
};
@@ -3484,7 +3484,7 @@ using namespace DX12_Internal;
range.BaseShaderRegister = x.slot;
range.NumDescriptors = x.count;
range.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
range.RegisterSpace = 0;
range.RegisterSpace = 0; // this will be filled by root signature depending on the table position (to mirror Vulkan behaviour)
internal_state->resource_heap.desc.NumDescriptors += range.NumDescriptors;
switch (x.binding)
@@ -3512,8 +3512,6 @@ using namespace DX12_Internal;
case RWTEXTURE1DARRAY:
case RWTEXTURE2D:
case RWTEXTURE2DARRAY:
case RWTEXTURECUBE:
case RWTEXTURECUBEARRAY:
case RWTEXTURE3D:
range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
break;
@@ -3536,12 +3534,12 @@ using namespace DX12_Internal;
internal_state->sampler_heap.ranges.emplace_back();
auto& range = internal_state->sampler_heap.ranges.back();
range = {};
range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
range.BaseShaderRegister = x.slot;
range.NumDescriptors = x.count;
range.RegisterSpace = 0; // this will be filled by root signature depending on the table position (to mirror Vulkan behaviour)
range.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
internal_state->sampler_heap.desc.NumDescriptors += range.NumDescriptors;
range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
internal_state->sampler_heap.desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
internal_state->sampler_heap.write_remap.push_back(prefix_sum);
prefix_sum += (size_t)range.NumDescriptors;
@@ -3565,31 +3563,39 @@ using namespace DX12_Internal;
desc.MaxLOD = x.sampler.desc.MaxLOD;
}
HRESULT hr = device->CreateDescriptorHeap(&internal_state->resource_heap.desc, IID_PPV_ARGS(&internal_state->resource_heap.heap));
assert(SUCCEEDED(hr));
hr = device->CreateDescriptorHeap(&internal_state->sampler_heap.desc, IID_PPV_ARGS(&internal_state->sampler_heap.heap));
assert(SUCCEEDED(hr));
HRESULT hr = S_OK;
internal_state->resource_heap.address = internal_state->resource_heap.heap->GetCPUDescriptorHandleForHeapStart();
internal_state->sampler_heap.address = internal_state->sampler_heap.heap->GetCPUDescriptorHandleForHeapStart();
uint32_t slot = 0;
for (auto& x : table->resources)
if (internal_state->resource_heap.desc.NumDescriptors > 0)
{
for (uint32_t i = 0; i < x.count; ++i)
hr = device->CreateDescriptorHeap(&internal_state->resource_heap.desc, IID_PPV_ARGS(&internal_state->resource_heap.heap));
assert(SUCCEEDED(hr));
internal_state->resource_heap.address = internal_state->resource_heap.heap->GetCPUDescriptorHandleForHeapStart();
uint32_t slot = 0;
for (auto& x : table->resources)
{
WriteDescriptor(table, slot, i, (const GPUResource*)nullptr);
for (uint32_t i = 0; i < x.count; ++i)
{
WriteDescriptor(table, slot, i, (const GPUResource*)nullptr);
}
slot++;
}
slot++;
}
slot = 0;
for (auto& x : table->samplers)
if (internal_state->sampler_heap.desc.NumDescriptors > 0)
{
for (uint32_t i = 0; i < x.count; ++i)
hr = device->CreateDescriptorHeap(&internal_state->sampler_heap.desc, IID_PPV_ARGS(&internal_state->sampler_heap.heap));
assert(SUCCEEDED(hr));
internal_state->sampler_heap.address = internal_state->sampler_heap.heap->GetCPUDescriptorHandleForHeapStart();
uint32_t slot = 0;
for (auto& x : table->samplers)
{
WriteDescriptor(table, slot, i, (const Sampler*)nullptr);
for (uint32_t i = 0; i < x.count; ++i)
{
WriteDescriptor(table, slot, i, (const Sampler*)nullptr);
}
slot++;
}
slot++;
}
return SUCCEEDED(hr);
@@ -4150,7 +4156,8 @@ using namespace DX12_Internal;
size_t remap = table_internal->resource_heap.write_remap[rangeIndex];
dst.ptr += (remap + arrayIndex) * (size_t)resource_descriptor_size;
switch (table->resources[rangeIndex].binding)
RESOURCEBINDING binding = table->resources[rangeIndex].binding;
switch (binding)
{
case CONSTANTBUFFER:
if (resource == nullptr || !resource->IsValid())
@@ -4185,8 +4192,44 @@ using namespace DX12_Internal;
{
D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc = {};
srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srv_desc.Format = DXGI_FORMAT_R32_UINT;
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
switch (binding)
{
case RAWBUFFER:
case STRUCTUREDBUFFER:
case TYPEDBUFFER:
srv_desc.Format = DXGI_FORMAT_R32_UINT;
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
break;
case TEXTURE1D:
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D;
break;
case TEXTURE1DARRAY:
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1DARRAY;
break;
case TEXTURE2D:
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
break;
case TEXTURE2DARRAY:
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;
break;
case TEXTURECUBE:
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;
break;
case TEXTURECUBEARRAY:
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY;
break;
case TEXTURE3D:
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;
break;
case ACCELERATIONSTRUCTURE:
srv_desc.Format = DXGI_FORMAT_UNKNOWN;
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_RAYTRACING_ACCELERATION_STRUCTURE;
break;
default:
assert(0);
break;
}
device->CreateShaderResourceView(nullptr, &srv_desc, dst);
}
else if (resource->IsTexture())
@@ -4230,14 +4273,37 @@ using namespace DX12_Internal;
case RWTEXTURE1DARRAY:
case RWTEXTURE2D:
case RWTEXTURE2DARRAY:
case RWTEXTURECUBE:
case RWTEXTURECUBEARRAY:
case RWTEXTURE3D:
if (resource == nullptr || !resource->IsValid())
{
D3D12_UNORDERED_ACCESS_VIEW_DESC uav_desc = {};
uav_desc.Format = DXGI_FORMAT_R32_UINT;
uav_desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
switch (binding)
{
case RWRAWBUFFER:
case RWSTRUCTUREDBUFFER:
case RWTYPEDBUFFER:
uav_desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
break;
case RWTEXTURE1D:
uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1D;
break;
case RWTEXTURE1DARRAY:
uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1DARRAY;
break;
case RWTEXTURE2D:
uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
break;
case RWTEXTURE2DARRAY:
uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY;
break;
case RWTEXTURE3D:
uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D;
break;
default:
assert(0);
break;
}
device->CreateUnorderedAccessView(nullptr, nullptr, &uav_desc, dst);
}
else if (resource->IsTexture())
-4
View File
@@ -4714,8 +4714,6 @@ using namespace Vulkan_Internal;
case RWTEXTURE1DARRAY:
case RWTEXTURE2D:
case RWTEXTURE2DARRAY:
case RWTEXTURECUBE:
case RWTEXTURECUBEARRAY:
case RWTEXTURE3D:
binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
binding.binding = x.slot + VULKAN_BINDING_SHIFT_U;
@@ -5276,8 +5274,6 @@ using namespace Vulkan_Internal;
case RWTEXTURE1DARRAY:
case RWTEXTURE2D:
case RWTEXTURE2DARRAY:
case RWTEXTURECUBE:
case RWTEXTURECUBEARRAY:
case RWTEXTURE3D:
descriptor.imageinfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
descriptor.imageinfo.sampler = VK_NULL_HANDLE;
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wiVersion
// minor features, major updates, breaking API changes
const int minor = 47;
// minor bug fixes, alterations, refactors, updates
const int revision = 18;
const int revision = 19;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);