From 24d7257b6ac518821eb6b2db9300a8f8db320bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Wed, 19 Jul 2023 21:02:55 +0200 Subject: [PATCH] hair particle AMD issue fix --- .../shaders/hairparticle_simulateCS.hlsl | 4 +- WickedEngine/shaders/impostor_prepareCS.hlsl | 4 +- WickedEngine/wiGraphicsDevice_DX12.cpp | 38 +++++++++---------- WickedEngine/wiHairParticle.cpp | 9 ++--- WickedEngine/wiScene.cpp | 3 +- WickedEngine/wiVersion.cpp | 2 +- 6 files changed, 28 insertions(+), 32 deletions(-) diff --git a/WickedEngine/shaders/hairparticle_simulateCS.hlsl b/WickedEngine/shaders/hairparticle_simulateCS.hlsl index 99911418b..2376d96d5 100644 --- a/WickedEngine/shaders/hairparticle_simulateCS.hlsl +++ b/WickedEngine/shaders/hairparticle_simulateCS.hlsl @@ -17,7 +17,7 @@ RWStructuredBuffer simulationBuffer : register(u0); RWByteAddressBuffer vertexBuffer_POS : register(u1); RWByteAddressBuffer vertexBuffer_UVS : register(u2); RWBuffer culledIndexBuffer : register(u3); -RWStructuredBuffer 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; diff --git a/WickedEngine/shaders/impostor_prepareCS.hlsl b/WickedEngine/shaders/impostor_prepareCS.hlsl index 2ba409a17..973c65e5d 100644 --- a/WickedEngine/shaders/impostor_prepareCS.hlsl +++ b/WickedEngine/shaders/impostor_prepareCS.hlsl @@ -13,7 +13,7 @@ static const float3 BILLBOARD[] = RWBuffer output_indices : register(u0); RWByteAddressBuffer output_vertices_pos_nor : register(u1); RWByteAddressBuffer output_impostor_data : register(u2); -RWStructuredBuffer 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); diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index 3de17036e..c9318d547 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -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 { diff --git a/WickedEngine/wiHairParticle.cpp b/WickedEngine/wiHairParticle.cpp index bdd33b89c..fbe2b330a 100644 --- a/WickedEngine/wiHairParticle.cpp +++ b/WickedEngine/wiHairParticle.cpp @@ -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); diff --git a/WickedEngine/wiScene.cpp b/WickedEngine/wiScene.cpp index 8bb659e4a..ddf55cb0d 100644 --- a/WickedEngine/wiScene.cpp +++ b/WickedEngine/wiScene.cpp @@ -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); } } diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 7ac6fb9f9..e066315d1 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -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);