RenderPrimitiveVK.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2024 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <TestFramework.h>
  5. #include <Renderer/VK/RenderPrimitiveVK.h>
  6. #include <Renderer/VK/FatalErrorIfFailedVK.h>
  7. void RenderPrimitiveVK::ReleaseVertexBuffer()
  8. {
  9. mRenderer->FreeBuffer(mVertexBuffer);
  10. mVertexBufferDeviceLocal = false;
  11. RenderPrimitive::ReleaseVertexBuffer();
  12. }
  13. void RenderPrimitiveVK::ReleaseIndexBuffer()
  14. {
  15. mRenderer->FreeBuffer(mIndexBuffer);
  16. mIndexBufferDeviceLocal = false;
  17. RenderPrimitive::ReleaseIndexBuffer();
  18. }
  19. void RenderPrimitiveVK::CreateVertexBuffer(int inNumVtx, int inVtxSize, const void *inData)
  20. {
  21. RenderPrimitive::CreateVertexBuffer(inNumVtx, inVtxSize, inData);
  22. VkDeviceSize size = VkDeviceSize(inNumVtx) * inVtxSize;
  23. if (inData != nullptr)
  24. {
  25. mRenderer->CreateDeviceLocalBuffer(inData, size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, mVertexBuffer);
  26. mVertexBufferDeviceLocal = true;
  27. }
  28. else
  29. mRenderer->CreateBuffer(size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, mVertexBuffer);
  30. }
  31. void *RenderPrimitiveVK::LockVertexBuffer()
  32. {
  33. JPH_ASSERT(!mVertexBufferDeviceLocal);
  34. void *data;
  35. FatalErrorIfFailed(vkMapMemory(mRenderer->GetDevice(), mVertexBuffer.mMemory, mVertexBuffer.mOffset, VkDeviceSize(mNumVtx) * mVtxSize, 0, &data));
  36. return data;
  37. }
  38. void RenderPrimitiveVK::UnlockVertexBuffer()
  39. {
  40. vkUnmapMemory(mRenderer->GetDevice(), mVertexBuffer.mMemory);
  41. }
  42. void RenderPrimitiveVK::CreateIndexBuffer(int inNumIdx, const uint32 *inData)
  43. {
  44. RenderPrimitive::CreateIndexBuffer(inNumIdx, inData);
  45. VkDeviceSize size = VkDeviceSize(inNumIdx) * sizeof(uint32);
  46. if (inData != nullptr)
  47. {
  48. mRenderer->CreateDeviceLocalBuffer(inData, size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, mIndexBuffer);
  49. mIndexBufferDeviceLocal = true;
  50. }
  51. else
  52. mRenderer->CreateBuffer(size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, mIndexBuffer);
  53. }
  54. uint32 *RenderPrimitiveVK::LockIndexBuffer()
  55. {
  56. JPH_ASSERT(!mIndexBufferDeviceLocal);
  57. void *data;
  58. vkMapMemory(mRenderer->GetDevice(), mIndexBuffer.mMemory, mIndexBuffer.mOffset, VkDeviceSize(mNumIdx) * sizeof(uint32), 0, &data);
  59. return reinterpret_cast<uint32 *>(data);
  60. }
  61. void RenderPrimitiveVK::UnlockIndexBuffer()
  62. {
  63. vkUnmapMemory(mRenderer->GetDevice(), mIndexBuffer.mMemory);
  64. }
  65. void RenderPrimitiveVK::Draw() const
  66. {
  67. VkCommandBuffer command_buffer = mRenderer->GetCommandBuffer();
  68. VkBuffer vertex_buffers[] = { mVertexBuffer.mBuffer };
  69. VkDeviceSize offsets[] = { 0 };
  70. vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, offsets);
  71. if (mIndexBuffer.mBuffer == VK_NULL_HANDLE)
  72. {
  73. vkCmdDraw(command_buffer, mNumVtxToDraw, 1, 0, 0);
  74. }
  75. else
  76. {
  77. vkCmdBindIndexBuffer(command_buffer, mIndexBuffer.mBuffer, 0, VK_INDEX_TYPE_UINT32);
  78. vkCmdDrawIndexed(command_buffer, mNumIdxToDraw, 1, 0, 0, 0);
  79. }
  80. }