hair particle AMD issue fix
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user