StreamBuffer.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "StreamBuffer.h"
  2. #include "vulkan/vulkan.h"
  3. #include "Graphics.h"
  4. namespace love
  5. {
  6. namespace graphics
  7. {
  8. namespace vulkan
  9. {
  10. static VkBufferUsageFlags getUsageFlags(BufferUsage mode)
  11. {
  12. switch (mode)
  13. {
  14. case BUFFERUSAGE_VERTEX: return VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
  15. case BUFFERUSAGE_INDEX: return VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
  16. case BUFFERUSAGE_UNIFORM: return VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
  17. default:
  18. throw love::Exception("unsupported BufferUsage mode");
  19. }
  20. }
  21. StreamBuffer::StreamBuffer(graphics::Graphics *gfx, BufferUsage mode, size_t size)
  22. : love::graphics::StreamBuffer(mode, size)
  23. , vgfx(dynamic_cast<Graphics*>(gfx))
  24. {
  25. loadVolatile();
  26. }
  27. bool StreamBuffer::loadVolatile()
  28. {
  29. allocator = vgfx->getVmaAllocator();
  30. VkBufferCreateInfo bufferInfo{};
  31. bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  32. bufferInfo.size = getSize();
  33. bufferInfo.usage = getUsageFlags(mode);
  34. bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  35. VmaAllocationCreateInfo allocCreateInfo = {};
  36. allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;
  37. allocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT; // always mapped
  38. vmaCreateBuffer(allocator, &bufferInfo, &allocCreateInfo, &buffer, &allocation, &allocInfo);
  39. usedGPUMemory = 0;
  40. return true;
  41. }
  42. void StreamBuffer::unloadVolatile()
  43. {
  44. if (buffer == VK_NULL_HANDLE)
  45. return;
  46. vgfx->queueCleanUp([allocator=allocator, buffer=buffer, allocation=allocation](){
  47. vmaDestroyBuffer(allocator, buffer, allocation);
  48. });
  49. buffer = VK_NULL_HANDLE;
  50. }
  51. StreamBuffer::~StreamBuffer()
  52. {
  53. unloadVolatile();
  54. }
  55. ptrdiff_t StreamBuffer::getHandle() const
  56. {
  57. return (ptrdiff_t) buffer;
  58. }
  59. love::graphics::StreamBuffer::MapInfo StreamBuffer::map(size_t minsize)
  60. {
  61. (void)minsize;
  62. return love::graphics::StreamBuffer::MapInfo((uint8*) allocInfo.pMappedData + usedGPUMemory, getSize());
  63. }
  64. size_t StreamBuffer::unmap(size_t usedSize)
  65. {
  66. return usedGPUMemory;
  67. }
  68. void StreamBuffer::markUsed(size_t usedSize)
  69. {
  70. usedGPUMemory += usedSize;
  71. }
  72. void StreamBuffer::nextFrame()
  73. {
  74. usedGPUMemory = 0;
  75. }
  76. } // vulkan
  77. } // graphics
  78. } // love