hair particle system gpu hang fix

This commit is contained in:
Turánszki János
2022-05-31 16:43:30 +02:00
parent 509aae5be5
commit d7c44cbdb7
2 changed files with 49 additions and 49 deletions
+48 -48
View File
@@ -3811,63 +3811,63 @@ namespace wi::scene
const TransformComponent& transform = *transforms.GetComponent(entity);
hair.UpdateCPU(transform, *mesh, dt);
}
}
GraphicsDevice* device = wi::graphics::GetDevice();
GraphicsDevice* device = wi::graphics::GetDevice();
uint32_t indexCount = (uint32_t)hair.primitiveBuffer.desc.size / (uint32_t)hair.primitiveBuffer.desc.stride;
uint32_t triangleCount = indexCount / 3u;
uint32_t meshletCount = triangle_count_to_meshlet_count(triangleCount);
uint32_t meshletOffset = meshletAllocator.fetch_add(meshletCount);
uint32_t indexCount = (uint32_t)hair.primitiveBuffer.desc.size / std::max(1u, (uint32_t)hair.primitiveBuffer.desc.stride);
uint32_t triangleCount = indexCount / 3u;
uint32_t meshletCount = triangle_count_to_meshlet_count(triangleCount);
uint32_t meshletOffset = meshletAllocator.fetch_add(meshletCount);
ShaderGeometry geometry;
geometry.init();
geometry.indexOffset = 0;
geometry.materialIndex = (uint)materials.GetIndex(entity);
geometry.ib = device->GetDescriptorIndex(&hair.primitiveBuffer, SubresourceType::SRV);
geometry.vb_pos_nor_wind = device->GetDescriptorIndex(&hair.vertexBuffer_POS[0], SubresourceType::SRV);
geometry.vb_pre = device->GetDescriptorIndex(&hair.vertexBuffer_POS[1], SubresourceType::SRV);
geometry.vb_uvs = device->GetDescriptorIndex(&hair.vertexBuffer_UVS, SubresourceType::SRV);
geometry.flags = SHADERMESH_FLAG_DOUBLE_SIDED | SHADERMESH_FLAG_HAIRPARTICLE;
geometry.meshletOffset = 0;
geometry.meshletCount = meshletCount;
ShaderGeometry geometry;
geometry.init();
geometry.indexOffset = 0;
geometry.materialIndex = (uint)materials.GetIndex(entity);
geometry.ib = device->GetDescriptorIndex(&hair.primitiveBuffer, SubresourceType::SRV);
geometry.vb_pos_nor_wind = device->GetDescriptorIndex(&hair.vertexBuffer_POS[0], SubresourceType::SRV);
geometry.vb_pre = device->GetDescriptorIndex(&hair.vertexBuffer_POS[1], SubresourceType::SRV);
geometry.vb_uvs = device->GetDescriptorIndex(&hair.vertexBuffer_UVS, SubresourceType::SRV);
geometry.flags = SHADERMESH_FLAG_DOUBLE_SIDED | SHADERMESH_FLAG_HAIRPARTICLE;
geometry.meshletOffset = 0;
geometry.meshletCount = meshletCount;
size_t geometryAllocation = geometryAllocator.fetch_add(1);
std::memcpy(geometryArrayMapped + geometryAllocation, &geometry, sizeof(geometry));
size_t geometryAllocation = geometryAllocator.fetch_add(1);
std::memcpy(geometryArrayMapped + geometryAllocation, &geometry, sizeof(geometry));
ShaderMeshInstance inst;
inst.init();
inst.uid = entity;
inst.layerMask = hair.layerMask;
inst.geometryOffset = (uint)geometryAllocation;
inst.emissive = wi::math::Pack_R11G11B10_FLOAT(XMFLOAT3(1, 1, 1));
inst.color = wi::math::CompressColor(XMFLOAT4(1, 1, 1, 1));
inst.geometryCount = 1;
inst.meshletOffset = meshletOffset;
ShaderMeshInstance inst;
inst.init();
inst.uid = entity;
inst.layerMask = hair.layerMask;
inst.geometryOffset = (uint)geometryAllocation;
inst.emissive = wi::math::Pack_R11G11B10_FLOAT(XMFLOAT3(1, 1, 1));
inst.color = wi::math::CompressColor(XMFLOAT4(1, 1, 1, 1));
inst.geometryCount = 1;
inst.meshletOffset = meshletOffset;
const size_t instanceIndex = objects.GetCount() + args.jobIndex;
std::memcpy(instanceArrayMapped + instanceIndex, &inst, sizeof(inst));
const size_t instanceIndex = objects.GetCount() + args.jobIndex;
std::memcpy(instanceArrayMapped + instanceIndex, &inst, sizeof(inst));
if (TLAS_instancesMapped != nullptr && hair.BLAS.IsValid())
if (TLAS_instancesMapped != nullptr && hair.BLAS.IsValid())
{
// TLAS instance data:
RaytracingAccelerationStructureDesc::TopLevel::Instance instance;
for (int i = 0; i < arraysize(instance.transform); ++i)
{
for (int j = 0; j < arraysize(instance.transform[i]); ++j)
{
// TLAS instance data:
RaytracingAccelerationStructureDesc::TopLevel::Instance instance;
for (int i = 0; i < arraysize(instance.transform); ++i)
{
for (int j = 0; j < arraysize(instance.transform[i]); ++j)
{
instance.transform[i][j] = wi::math::IDENTITY_MATRIX.m[j][i];
}
}
instance.instance_id = (uint32_t)instanceIndex;
instance.instance_mask = hair.layerMask & 0xFF;
instance.bottom_level = &hair.BLAS;
instance.instance_contribution_to_hit_group_index = 0;
instance.flags = RaytracingAccelerationStructureDesc::TopLevel::Instance::FLAG_TRIANGLE_CULL_DISABLE;
void* dest = (void*)((size_t)TLAS_instancesMapped + instanceIndex * device->GetTopLevelAccelerationStructureInstanceSize());
device->WriteTopLevelAccelerationStructureInstance(&instance, dest);
instance.transform[i][j] = wi::math::IDENTITY_MATRIX.m[j][i];
}
}
instance.instance_id = (uint32_t)instanceIndex;
instance.instance_mask = hair.layerMask & 0xFF;
instance.bottom_level = &hair.BLAS;
instance.instance_contribution_to_hit_group_index = 0;
instance.flags = RaytracingAccelerationStructureDesc::TopLevel::Instance::FLAG_TRIANGLE_CULL_DISABLE;
void* dest = (void*)((size_t)TLAS_instancesMapped + instanceIndex * device->GetTopLevelAccelerationStructureInstanceSize());
device->WriteTopLevelAccelerationStructureInstance(&instance, dest);
}
});
@@ -3905,7 +3905,7 @@ namespace wi::scene
GraphicsDevice* device = wi::graphics::GetDevice();
uint32_t indexCount = (uint32_t)emitter.primitiveBuffer.desc.size / (uint32_t)emitter.primitiveBuffer.desc.stride;
uint32_t indexCount = (uint32_t)emitter.primitiveBuffer.desc.size / std::max(1u, (uint32_t)emitter.primitiveBuffer.desc.stride);
uint32_t triangleCount = indexCount / 3u;
uint32_t meshletCount = triangle_count_to_meshlet_count(triangleCount);
uint32_t meshletOffset = meshletAllocator.fetch_add(meshletCount);
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wi::version
// minor features, major updates, breaking compatibility changes
const int minor = 60;
// minor bug fixes, alterations, refactors, updates
const int revision = 75;
const int revision = 76;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);