StreamBuffer.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include "StreamBuffer.h"
  2. #include "vulkan/vulkan.h"
  3. namespace love {
  4. namespace graphics {
  5. namespace vulkan {
  6. static VkBufferUsageFlags getUsageFlags(BufferUsage mode) {
  7. switch (mode) {
  8. case BUFFERUSAGE_VERTEX: return VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
  9. case BUFFERUSAGE_INDEX: return VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
  10. case BUFFERUSAGE_UNIFORM: return VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
  11. default:
  12. throw love::Exception("unsupported BufferUsage mode");
  13. }
  14. }
  15. StreamBuffer::StreamBuffer(VmaAllocator allocator, BufferUsage mode, size_t size)
  16. : love::graphics::StreamBuffer(mode, size), allocator(allocator) {
  17. VkBufferCreateInfo bufferInfo{};
  18. bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  19. bufferInfo.size = getSize();
  20. bufferInfo.usage = getUsageFlags(mode);
  21. bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  22. VmaAllocationCreateInfo allocCreateInfo = {};
  23. allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;
  24. allocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT; // always mapped
  25. vmaCreateBuffer(allocator, &bufferInfo, &allocCreateInfo, &buffer, &allocation, &allocInfo);
  26. usedGPUMemory = 0;
  27. }
  28. StreamBuffer::~StreamBuffer() {
  29. // vmaDestroyBuffer(allocator, buffer, allocation);
  30. }
  31. love::graphics::StreamBuffer::MapInfo StreamBuffer::map(size_t minsize) {
  32. (void)minsize;
  33. return love::graphics::StreamBuffer::MapInfo((uint8*) allocInfo.pMappedData + usedGPUMemory, getSize());
  34. }
  35. size_t StreamBuffer::unmap(size_t usedSize) {
  36. return usedGPUMemory;
  37. }
  38. void StreamBuffer::markUsed(size_t usedSize) {
  39. usedGPUMemory += usedSize;
  40. }
  41. void StreamBuffer::nextFrame() {
  42. usedGPUMemory = 0;
  43. }
  44. }
  45. }
  46. }