RenderInstancesVK.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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/RenderInstancesVK.h>
  6. #include <Renderer/VK/RenderPrimitiveVK.h>
  7. #include <Renderer/VK/FatalErrorIfFailedVK.h>
  8. void RenderInstancesVK::Clear()
  9. {
  10. mRenderer->FreeBuffer(mInstancesBuffer);
  11. }
  12. void RenderInstancesVK::CreateBuffer(int inNumInstances, int inInstanceSize)
  13. {
  14. Clear();
  15. mRenderer->CreateBuffer(VkDeviceSize(inNumInstances) * inInstanceSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, mInstancesBuffer);
  16. }
  17. void *RenderInstancesVK::Lock()
  18. {
  19. void *data;
  20. FatalErrorIfFailed(vkMapMemory(mRenderer->GetDevice(), mInstancesBuffer.mMemory, mInstancesBuffer.mOffset, mInstancesBuffer.mSize, 0, &data));
  21. return data;
  22. }
  23. void RenderInstancesVK::Unlock()
  24. {
  25. vkUnmapMemory(mRenderer->GetDevice(), mInstancesBuffer.mMemory);
  26. }
  27. void RenderInstancesVK::Draw(RenderPrimitive *inPrimitive, int inStartInstance, int inNumInstances) const
  28. {
  29. if (inNumInstances <= 0)
  30. return;
  31. VkCommandBuffer command_buffer = mRenderer->GetCommandBuffer();
  32. RenderPrimitiveVK *primitive = static_cast<RenderPrimitiveVK *>(inPrimitive);
  33. VkBuffer buffers[] = { primitive->mVertexBuffer.mBuffer, mInstancesBuffer.mBuffer };
  34. VkDeviceSize offsets[] = { 0, 0 };
  35. vkCmdBindVertexBuffers(command_buffer, 0, 2, buffers, offsets);
  36. if (primitive->mIndexBuffer.mBuffer == VK_NULL_HANDLE)
  37. {
  38. vkCmdDraw(command_buffer, primitive->mNumVtxToDraw, inNumInstances, 0, inStartInstance);
  39. }
  40. else
  41. {
  42. vkCmdBindIndexBuffer(command_buffer, primitive->mIndexBuffer.mBuffer, 0, VK_INDEX_TYPE_UINT32);
  43. vkCmdDrawIndexed(command_buffer, primitive->mNumIdxToDraw, inNumInstances, 0, 0, inStartInstance);
  44. }
  45. }