| 420 | } |
| 421 | |
| 422 | void OmmBuildQueue::Finalize(nvrhi::ICommandList& commandList, BuildTask& task) |
| 423 | { |
| 424 | std::unique_ptr<MeshDebugData> debugData = std::make_unique<MeshDebugData>(); |
| 425 | debugData->ommArrayDataBuffer = task.buffers.ommArrayDataBuffer; |
| 426 | debugData->ommDescBuffer = task.buffers.ommDescBuffer; |
| 427 | debugData->ommIndexBuffer = task.buffers.ommIndexBuffer; |
| 428 | |
| 429 | debugData->ommArrayDataBufferDescriptor = |
| 430 | std::make_shared<donut::engine::DescriptorHandle>(m_descriptorTable->CreateDescriptorHandle(nvrhi::BindingSetItem::RawBuffer_SRV(0, task.buffers.ommArrayDataBuffer))); |
| 431 | debugData->ommDescBufferDescriptor = |
| 432 | std::make_shared<donut::engine::DescriptorHandle>(m_descriptorTable->CreateDescriptorHandle(nvrhi::BindingSetItem::RawBuffer_SRV(0, task.buffers.ommDescBuffer))); |
| 433 | debugData->ommIndexBufferDescriptor = |
| 434 | std::make_shared<donut::engine::DescriptorHandle>(m_descriptorTable->CreateDescriptorHandle(nvrhi::BindingSetItem::RawBuffer_SRV(0, task.buffers.ommIndexBuffer))); |
| 435 | |
| 436 | auto mesh = std::static_pointer_cast<MeshInfoEx>(task.input.mesh); |
| 437 | assert(!mesh->DebugData); |
| 438 | mesh->DebugData = std::move(debugData); |
| 439 | mesh->DebugDataDirty = true; |
| 440 | |
| 441 | void* pReadbackData = m_device->mapBuffer(task.buffers.ommReadbackBuffer, nvrhi::CpuAccessMode::Read); |
| 442 | for (uint32_t i = 0; i < task.input.geometries.size(); ++i) |
| 443 | { |
| 444 | // Get debug info |
| 445 | BufferInfo& bufferInfo = task.bufferInfos[i]; |
| 446 | omm::GpuBakeNvrhi::PostDispatchInfo postDispatchInfo; |
| 447 | m_baker->ReadPostDispatchInfo((uint8_t*)pReadbackData + bufferInfo.ommPostDispatchInfoReadbackOffset, sizeof(postDispatchInfo), postDispatchInfo); |
| 448 | |
| 449 | const OmmBuildQueue::BuildInput::Geometry& geom = task.input.geometries[i]; |
| 450 | MeshGeometryEx* meshGeometry = static_cast<MeshGeometryEx*>(task.input.mesh->geometries[geom.geometryIndexInMesh].get()); |
| 451 | |
| 452 | meshGeometry->DebugData.ommArrayDataOffset = (uint32_t)bufferInfo.ommArrayDataOffset; |
| 453 | meshGeometry->DebugData.ommDescBufferOffset = (uint32_t)bufferInfo.ommDescArrayOffset; |
| 454 | meshGeometry->DebugData.ommIndexBufferOffset = (uint32_t)bufferInfo.ommIndexOffset; |
| 455 | meshGeometry->DebugData.ommIndexBufferFormat = bufferInfo.ommIndexFormat; |
| 456 | meshGeometry->DebugData.ommStatsTotalKnown = postDispatchInfo.ommTotalOpaqueCount + postDispatchInfo.ommTotalTransparentCount; |
| 457 | meshGeometry->DebugData.ommStatsTotalUnknown = postDispatchInfo.ommTotalUnknownCount; |
| 458 | } |
| 459 | m_device->unmapBuffer(task.buffers.ommReadbackBuffer); |
| 460 | |
| 461 | task.buffers.ommReadbackBuffer = nullptr; |
| 462 | m_baker->Clear(); |
| 463 | } |
| 464 | |
| 465 | void OmmBuildQueue::BuildTask::Reset() |
| 466 | { |