RenderInstances.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <TestFramework.h>
  5. #include <Renderer/RenderInstances.h>
  6. #include <Renderer/RenderPrimitive.h>
  7. #include <Renderer/FatalErrorIfFailed.h>
  8. void RenderInstances::Clear()
  9. {
  10. if (mInstanceBuffer != nullptr)
  11. mRenderer->RecycleD3DResourceOnUploadHeap(mInstanceBuffer.Get(), mInstanceBufferSize);
  12. mInstanceBuffer = nullptr;
  13. mInstanceBufferSize = 0;
  14. mInstanceSize = 0;
  15. }
  16. void RenderInstances::CreateBuffer(int inNumInstances, int inInstanceSize)
  17. {
  18. if (mInstanceBuffer == nullptr || mInstanceBufferSize < inNumInstances * inInstanceSize)
  19. {
  20. // Delete the old buffer
  21. Clear();
  22. // Calculate size
  23. mInstanceBufferSize = inNumInstances * inInstanceSize;
  24. // Create buffer
  25. mInstanceBuffer = mRenderer->CreateD3DResourceOnUploadHeap(mInstanceBufferSize);
  26. JPH_IF_DEBUG(mInstanceBuffer->SetName(L"Instance Buffer");)
  27. }
  28. // Update parameters
  29. mInstanceSize = inInstanceSize;
  30. }
  31. void *RenderInstances::Lock()
  32. {
  33. uint32 *mapped_resource;
  34. D3D12_RANGE range = { 0, 0 };
  35. mInstanceBuffer->Map(0, &range, (void **)&mapped_resource);
  36. return mapped_resource;
  37. }
  38. void RenderInstances::Unlock()
  39. {
  40. mInstanceBuffer->Unmap(0, nullptr);
  41. }
  42. void RenderInstances::Draw(RenderPrimitive *inPrimitive, int inStartInstance, int inNumInstances) const
  43. {
  44. if (inNumInstances <= 0)
  45. return;
  46. ID3D12GraphicsCommandList *command_list = mRenderer->GetCommandList();
  47. // Set topology
  48. command_list->IASetPrimitiveTopology(inPrimitive->mType);
  49. D3D12_VERTEX_BUFFER_VIEW vb_view[2];
  50. // Vertex buffer
  51. vb_view[0].BufferLocation = inPrimitive->mVtxBuffer->GetGPUVirtualAddress();
  52. vb_view[0].StrideInBytes = inPrimitive->mVtxSize;
  53. vb_view[0].SizeInBytes = inPrimitive->mNumVtxToDraw * inPrimitive->mVtxSize;
  54. // Instances buffer
  55. vb_view[1].BufferLocation = mInstanceBuffer->GetGPUVirtualAddress();
  56. vb_view[1].StrideInBytes = mInstanceSize;
  57. vb_view[1].SizeInBytes = mInstanceBufferSize;
  58. command_list->IASetVertexBuffers(0, 2, &vb_view[0]);
  59. if (inPrimitive->mIdxBuffer == nullptr)
  60. {
  61. // Draw instanced primitive
  62. command_list->DrawInstanced(inPrimitive->mNumVtxToDraw, inNumInstances, 0, inStartInstance);
  63. }
  64. else
  65. {
  66. // Set index buffer
  67. D3D12_INDEX_BUFFER_VIEW ib_view;
  68. ib_view.BufferLocation = inPrimitive->mIdxBuffer->GetGPUVirtualAddress();
  69. ib_view.SizeInBytes = inPrimitive->mNumIdxToDraw * sizeof(uint32);
  70. ib_view.Format = DXGI_FORMAT_R32_UINT;
  71. command_list->IASetIndexBuffer(&ib_view);
  72. // Draw instanced primitive
  73. command_list->DrawIndexedInstanced(inPrimitive->mNumIdxToDraw, inNumInstances, 0, 0, inStartInstance);
  74. }
  75. }