hair particle AMD issue fix

This commit is contained in:
Turánszki János
2023-07-19 21:02:55 +02:00
parent d88576162b
commit 24d7257b6a
6 changed files with 28 additions and 32 deletions
@@ -17,7 +17,7 @@ RWStructuredBuffer<PatchSimulationData> simulationBuffer : register(u0);
RWByteAddressBuffer vertexBuffer_POS : register(u1);
RWByteAddressBuffer vertexBuffer_UVS : register(u2);
RWBuffer<uint> culledIndexBuffer : register(u3);
RWStructuredBuffer<IndirectDrawArgsIndexedInstanced> indirectBuffer : register(u4);
RWByteAddressBuffer indirectBuffer : register(u4);
[numthreads(THREADCOUNT_SIMULATEHAIR, 1, 1)]
void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint groupIndex : SV_GroupIndex)
@@ -292,7 +292,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint groupIn
uint waveOffset;
if (WaveIsFirstLane() && waveAppendCount > 0)
{
InterlockedAdd(indirectBuffer[0].IndexCountPerInstance, waveAppendCount * 6, waveOffset);
indirectBuffer.InterlockedAdd(0, waveAppendCount * 6, waveOffset);
}
waveOffset = WaveReadLaneFirst(waveOffset) / 6;
+2 -2
View File
@@ -13,7 +13,7 @@ static const float3 BILLBOARD[] =
RWBuffer<uint> output_indices : register(u0);
RWByteAddressBuffer output_vertices_pos_nor : register(u1);
RWByteAddressBuffer output_impostor_data : register(u2);
RWStructuredBuffer<IndirectDrawArgsIndexedInstanced> output_indirect : register(u3);
RWByteAddressBuffer output_indirect : register(u3);
struct ObjectCount
{
@@ -47,7 +47,7 @@ void main(uint3 DTid : SV_DispatchThreadID)
uint waveOffset;
if (WaveIsFirstLane() && waveAppendCount > 0)
{
InterlockedAdd(output_indirect[0].IndexCountPerInstance, waveAppendCount * 6u, waveOffset);
output_indirect.InterlockedAdd(0, waveAppendCount * 6u, waveOffset);
}
waveOffset = WaveReadLaneFirst(waveOffset);
+19 -19
View File
@@ -4946,16 +4946,7 @@ using namespace dx12_internal;
if (format == Format::UNKNOWN)
{
if (has_flag(desc.misc_flags, ResourceMiscFlag::BUFFER_RAW))
{
// This is a Raw Buffer
srv_desc.Format = DXGI_FORMAT_R32_TYPELESS;
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
srv_desc.Buffer.FirstElement = (UINT)offset / sizeof(uint32_t);
srv_desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_RAW;
srv_desc.Buffer.NumElements = (UINT)std::min(size, desc.size - offset) / sizeof(uint32_t);
}
else if (has_flag(desc.misc_flags, ResourceMiscFlag::BUFFER_STRUCTURED) || (structuredbuffer_stride_change != nullptr))
if (has_flag(desc.misc_flags, ResourceMiscFlag::BUFFER_STRUCTURED) || (structuredbuffer_stride_change != nullptr))
{
// This is a Structured Buffer
uint32_t stride = desc.stride;
@@ -4969,6 +4960,15 @@ using namespace dx12_internal;
srv_desc.Buffer.NumElements = (UINT)std::min(size, desc.size - offset) / stride;
srv_desc.Buffer.StructureByteStride = stride;
}
else if (has_flag(desc.misc_flags, ResourceMiscFlag::BUFFER_RAW))
{
// This is a Raw Buffer
srv_desc.Format = DXGI_FORMAT_R32_TYPELESS;
srv_desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
srv_desc.Buffer.FirstElement = (UINT)offset / sizeof(uint32_t);
srv_desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_RAW;
srv_desc.Buffer.NumElements = (UINT)std::min(size, desc.size - offset) / sizeof(uint32_t);
}
}
else
{
@@ -5000,15 +5000,7 @@ using namespace dx12_internal;
if (format == Format::UNKNOWN)
{
if (has_flag(desc.misc_flags, ResourceMiscFlag::BUFFER_RAW))
{
// This is a Raw Buffer
uav_desc.Format = DXGI_FORMAT_R32_TYPELESS;
uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_RAW;
uav_desc.Buffer.FirstElement = (UINT)offset / sizeof(uint32_t);
uav_desc.Buffer.NumElements = (UINT)std::min(size, desc.size - offset) / sizeof(uint32_t);
}
else if (has_flag(desc.misc_flags, ResourceMiscFlag::BUFFER_STRUCTURED) || (structuredbuffer_stride_change != nullptr))
if (has_flag(desc.misc_flags, ResourceMiscFlag::BUFFER_STRUCTURED) || (structuredbuffer_stride_change != nullptr))
{
// This is a Structured Buffer
uint32_t stride = desc.stride;
@@ -5021,6 +5013,14 @@ using namespace dx12_internal;
uav_desc.Buffer.NumElements = (UINT)std::min(size, desc.size - offset) / stride;
uav_desc.Buffer.StructureByteStride = stride;
}
else if (has_flag(desc.misc_flags, ResourceMiscFlag::BUFFER_RAW))
{
// This is a Raw Buffer
uav_desc.Format = DXGI_FORMAT_R32_TYPELESS;
uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_RAW;
uav_desc.Buffer.FirstElement = (UINT)offset / sizeof(uint32_t);
uav_desc.Buffer.NumElements = (UINT)std::min(size, desc.size - offset) / sizeof(uint32_t);
}
}
else
{
+3 -6
View File
@@ -89,8 +89,6 @@ namespace wi
{
GPUBufferDesc bd;
bd.usage = Usage::DEFAULT;
bd.bind_flags = BindFlag::SHADER_RESOURCE | BindFlag::UNORDERED_ACCESS;
bd.misc_flags = ResourceMiscFlag::BUFFER_STRUCTURED;
bd.bind_flags = BindFlag::SHADER_RESOURCE | BindFlag::UNORDERED_ACCESS | BindFlag::INDEX_BUFFER;
bd.misc_flags = ResourceMiscFlag::BUFFER_RAW | ResourceMiscFlag::INDIRECT_ARGS;
if (device->CheckCapability(GraphicsDeviceCapability::RAYTRACING))
@@ -99,7 +97,7 @@ namespace wi
}
const Format ib_format = GetIndexBufferFormatRaw(particleCount * 4);
const uint64_t alignment = device->GetMinOffsetAlignment(&bd);
const uint64_t alignment = std::max(device->GetMinOffsetAlignment(&bd), sizeof(PatchSimulationData)); // also align to structure stride
simulation_view.size = sizeof(PatchSimulationData) * particleCount;
vb_pos[0].size = sizeof(MeshComponent::Vertex_POS) * 4 * particleCount;
@@ -157,11 +155,10 @@ namespace wi
ib_culled.descriptor_srv = device->GetDescriptorIndex(&generalBuffer, SubresourceType::SRV, ib_culled.subresource_srv);
ib_culled.descriptor_uav = device->GetDescriptorIndex(&generalBuffer, SubresourceType::UAV, ib_culled.subresource_uav);
const uint32_t indirect_stride = sizeof(IndirectDrawArgsIndexedInstanced);
indirect_view.offset = buffer_offset;
buffer_offset += AlignTo(indirect_view.size, alignment);
indirect_view.subresource_srv = device->CreateSubresource(&generalBuffer, SubresourceType::SRV, indirect_view.offset, indirect_view.size, nullptr, &indirect_stride);
indirect_view.subresource_uav = device->CreateSubresource(&generalBuffer, SubresourceType::UAV, indirect_view.offset, indirect_view.size, nullptr, &indirect_stride);
indirect_view.subresource_srv = device->CreateSubresource(&generalBuffer, SubresourceType::SRV, indirect_view.offset, indirect_view.size);
indirect_view.subresource_uav = device->CreateSubresource(&generalBuffer, SubresourceType::UAV, indirect_view.offset, indirect_view.size);
indirect_view.descriptor_srv = device->GetDescriptorIndex(&generalBuffer, SubresourceType::SRV, indirect_view.subresource_srv);
indirect_view.descriptor_uav = device->GetDescriptorIndex(&generalBuffer, SubresourceType::UAV, indirect_view.subresource_uav);
+1 -2
View File
@@ -720,11 +720,10 @@ namespace wi::scene
impostor_data.descriptor_srv = device->GetDescriptorIndex(&impostorBuffer, SubresourceType::SRV, impostor_data.subresource_srv);
impostor_data.descriptor_uav = device->GetDescriptorIndex(&impostorBuffer, SubresourceType::UAV, impostor_data.subresource_uav);
const uint32_t indirect_stride = sizeof(IndirectDrawArgsIndexedInstanced);
impostor_indirect.offset = buffer_offset;
impostor_indirect.size = sizeof(IndirectDrawArgsIndexedInstanced);
buffer_offset += AlignTo(impostor_data.size, alignment);
impostor_indirect.subresource_uav = device->CreateSubresource(&impostorBuffer, SubresourceType::UAV, impostor_indirect.offset, impostor_indirect.size, nullptr, &indirect_stride);
impostor_indirect.subresource_uav = device->CreateSubresource(&impostorBuffer, SubresourceType::UAV, impostor_indirect.offset, impostor_indirect.size);
}
}
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wi::version
// minor features, major updates, breaking compatibility changes
const int minor = 71;
// minor bug fixes, alterations, refactors, updates
const int revision = 249;
const int revision = 250;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);