DX12BLAS.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "DX12BLAS.h"
  2. #include "DX12Buffer.h"
  3. #include "DX12CommandQueue.h"
  4. Framework::DX12BLAS::DX12BLAS(
  5. ID3D12Device5* zDevice, DX12DirectCommandQueue* zDirectQueue)
  6. : ReferenceCounter(),
  7. scratchBuffer(new DX12Buffer(1,
  8. zDevice,
  9. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  10. D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS)),
  11. resultBuffer(new DX12Buffer(1,
  12. zDevice,
  13. dynamic_cast<DX12CommandQueue*>(zDirectQueue->getThis()),
  14. D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS)),
  15. zDevice(zDevice),
  16. zDirectQueue(zDirectQueue),
  17. geometryDesc(new D3D12_RAYTRACING_GEOMETRY_DESC())
  18. {}
  19. Framework::DX12BLAS::~DX12BLAS()
  20. {
  21. scratchBuffer->release();
  22. resultBuffer->release();
  23. delete geometryDesc;
  24. }
  25. void Framework::DX12BLAS::build(
  26. DX12Buffer* vertexBuffer, DX12Buffer* indexBuffer)
  27. {
  28. memset(geometryDesc, 0, sizeof(D3D12_RAYTRACING_GEOMETRY_DESC));
  29. geometryDesc->Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
  30. geometryDesc->Flags = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
  31. geometryDesc->Triangles.VertexBuffer.StartAddress
  32. = vertexBuffer->zBuffer()->GetGPUVirtualAddress();
  33. geometryDesc->Triangles.VertexBuffer.StrideInBytes
  34. = vertexBuffer->getElementLength();
  35. geometryDesc->Triangles.VertexCount
  36. = (unsigned)vertexBuffer->getElementCount();
  37. geometryDesc->Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT;
  38. geometryDesc->Triangles.IndexBuffer
  39. = indexBuffer->zBuffer()->GetGPUVirtualAddress();
  40. geometryDesc->Triangles.IndexCount
  41. = (unsigned)indexBuffer->getElementCount();
  42. geometryDesc->Triangles.IndexFormat = DXGI_FORMAT_R32_UINT;
  43. D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS prebuildDesc;
  44. prebuildDesc.Type
  45. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
  46. prebuildDesc.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
  47. prebuildDesc.NumDescs = 1;
  48. prebuildDesc.pGeometryDescs = geometryDesc;
  49. prebuildDesc.Flags
  50. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
  51. D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
  52. zDevice->GetRaytracingAccelerationStructurePrebuildInfo(
  53. &prebuildDesc, &info);
  54. scratchBuffer->setLength(
  55. ROUND_UP_POWER_OF_2((int)info.ScratchDataSizeInBytes, 256));
  56. scratchBuffer->createBufferWithoutData(D3D12_RESOURCE_STATE_COMMON);
  57. resultBuffer->setLength(
  58. ROUND_UP_POWER_OF_2((int)info.ResultDataMaxSizeInBytes, 256));
  59. resultBuffer->createBufferWithoutData(
  60. D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE);
  61. D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc;
  62. buildDesc.Inputs.Type
  63. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
  64. buildDesc.Inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
  65. buildDesc.Inputs.NumDescs = 1;
  66. buildDesc.Inputs.pGeometryDescs = geometryDesc;
  67. buildDesc.DestAccelerationStructureData
  68. = {resultBuffer->zBuffer()->GetGPUVirtualAddress()};
  69. buildDesc.ScratchAccelerationStructureData
  70. = {scratchBuffer->zBuffer()->GetGPUVirtualAddress()};
  71. buildDesc.SourceAccelerationStructureData = 0;
  72. buildDesc.Inputs.Flags
  73. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
  74. // Build the AS
  75. zDirectQueue->zCommandList()->BuildRaytracingAccelerationStructure(
  76. &buildDesc, 0, nullptr);
  77. }
  78. Framework::DX12Buffer* Framework::DX12BLAS::zScratchBuffer() const
  79. {
  80. return scratchBuffer;
  81. }
  82. Framework::DX12Buffer* Framework::DX12BLAS::zResultBuffer() const
  83. {
  84. return resultBuffer;
  85. }