hair particle system gpu hang fix
This commit is contained in:
+48
-48
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user