DX12BLAS.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. vertexDataBuffer(0),
  16. indexBuffer(0),
  17. polygonSizeBuffer(0),
  18. zDevice(zDevice),
  19. zDirectQueue(zDirectQueue),
  20. geometryDesc(new D3D12_RAYTRACING_GEOMETRY_DESC())
  21. {}
  22. Framework::DX12BLAS::~DX12BLAS()
  23. {
  24. scratchBuffer->release();
  25. resultBuffer->release();
  26. if (vertexDataBuffer)
  27. {
  28. vertexDataBuffer->release();
  29. }
  30. if (indexBuffer)
  31. {
  32. indexBuffer->release();
  33. }
  34. if (polygonSizeBuffer)
  35. {
  36. polygonSizeBuffer->release();
  37. }
  38. delete geometryDesc;
  39. }
  40. void Framework::DX12BLAS::build(DX12Buffer* zVertexBuffer,
  41. DX12Buffer* vertexDataBuffer,
  42. DX12Buffer* indexBuffer,
  43. DX12Buffer* polygonSizeBuffer)
  44. {
  45. if (this->indexBuffer)
  46. {
  47. this->indexBuffer->release();
  48. }
  49. if (this->vertexDataBuffer)
  50. {
  51. this->vertexDataBuffer->release();
  52. }
  53. if (this->polygonSizeBuffer)
  54. {
  55. this->polygonSizeBuffer->release();
  56. }
  57. this->vertexDataBuffer = vertexDataBuffer;
  58. this->indexBuffer = indexBuffer;
  59. this->polygonSizeBuffer = polygonSizeBuffer;
  60. memset(geometryDesc, 0, sizeof(D3D12_RAYTRACING_GEOMETRY_DESC));
  61. geometryDesc->Type = D3D12_RAYTRACING_GEOMETRY_TYPE_TRIANGLES;
  62. geometryDesc->Flags = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE;
  63. geometryDesc->Triangles.VertexBuffer.StartAddress
  64. = zVertexBuffer->zBuffer()->GetGPUVirtualAddress();
  65. geometryDesc->Triangles.VertexBuffer.StrideInBytes
  66. = zVertexBuffer->getElementLength();
  67. geometryDesc->Triangles.VertexCount
  68. = (unsigned)zVertexBuffer->getElementCount();
  69. geometryDesc->Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT;
  70. geometryDesc->Triangles.IndexBuffer
  71. = indexBuffer->zBuffer()->GetGPUVirtualAddress();
  72. geometryDesc->Triangles.IndexCount
  73. = (unsigned)indexBuffer->getElementCount();
  74. geometryDesc->Triangles.IndexFormat = DXGI_FORMAT_R32_UINT;
  75. D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS prebuildDesc;
  76. prebuildDesc.Type
  77. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
  78. prebuildDesc.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
  79. prebuildDesc.NumDescs = 1;
  80. prebuildDesc.pGeometryDescs = geometryDesc;
  81. prebuildDesc.Flags
  82. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
  83. D3D12_RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO info = {};
  84. zDevice->GetRaytracingAccelerationStructurePrebuildInfo(
  85. &prebuildDesc, &info);
  86. scratchBuffer->setLength(
  87. ROUND_UP_POWER_OF_2((int)info.ScratchDataSizeInBytes, 256));
  88. scratchBuffer->createBufferWithoutData(D3D12_RESOURCE_STATE_COMMON);
  89. resultBuffer->setLength(
  90. ROUND_UP_POWER_OF_2((int)info.ResultDataMaxSizeInBytes, 256));
  91. resultBuffer->createBufferWithoutData(
  92. D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE);
  93. D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC buildDesc;
  94. buildDesc.Inputs.Type
  95. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL;
  96. buildDesc.Inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY;
  97. buildDesc.Inputs.NumDescs = 1;
  98. buildDesc.Inputs.pGeometryDescs = geometryDesc;
  99. buildDesc.DestAccelerationStructureData
  100. = {resultBuffer->zBuffer()->GetGPUVirtualAddress()};
  101. buildDesc.ScratchAccelerationStructureData
  102. = {scratchBuffer->zBuffer()->GetGPUVirtualAddress()};
  103. buildDesc.SourceAccelerationStructureData = 0;
  104. buildDesc.Inputs.Flags
  105. = D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAG_NONE;
  106. // Build the AS
  107. zDirectQueue->zCommandList()->BuildRaytracingAccelerationStructure(
  108. &buildDesc, 0, nullptr);
  109. }
  110. Framework::DX12Buffer* Framework::DX12BLAS::zScratchBuffer() const
  111. {
  112. return scratchBuffer;
  113. }
  114. Framework::DX12Buffer* Framework::DX12BLAS::zResultBuffer() const
  115. {
  116. return resultBuffer;
  117. }
  118. Framework::DX12Buffer* Framework::DX12BLAS::zVertexDataBuffer() const
  119. {
  120. return vertexDataBuffer;
  121. }
  122. Framework::DX12Buffer* Framework::DX12BLAS::zIndexBuffer() const
  123. {
  124. return indexBuffer;
  125. }
  126. Framework::DX12Buffer* Framework::DX12BLAS::zPolygonSizeBuffer() const
  127. {
  128. return polygonSizeBuffer;
  129. }