VkBuffer.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Gr/Buffer.h>
  7. #include <AnKi/Gr/Vulkan/VkGpuMemoryManager.h>
  8. #include <AnKi/Util/HashMap.h>
  9. namespace anki {
  10. /// @addtogroup vulkan
  11. /// @{
  12. /// Buffer implementation
  13. class BufferImpl final : public Buffer
  14. {
  15. friend class Buffer;
  16. public:
  17. BufferImpl(CString name)
  18. : Buffer(name)
  19. {
  20. }
  21. ~BufferImpl();
  22. Error init(const BufferInitInfo& inf);
  23. VkBuffer getHandle() const
  24. {
  25. ANKI_ASSERT(isCreated());
  26. return m_handle;
  27. }
  28. Bool usageValid(BufferUsageBit usage) const
  29. {
  30. return (m_usage & usage) == usage;
  31. }
  32. PtrSize getActualSize() const
  33. {
  34. ANKI_ASSERT(m_actualSize > 0);
  35. return m_actualSize;
  36. }
  37. VkBufferMemoryBarrier computeBarrierInfo(BufferUsageBit before, BufferUsageBit after, VkPipelineStageFlags& srcStages,
  38. VkPipelineStageFlags& dstStages) const;
  39. /// Only for texture buffers.
  40. /// @note It's thread-safe
  41. VkBufferView getOrCreateBufferView(Format fmt, PtrSize offset, PtrSize range) const;
  42. private:
  43. VkBuffer m_handle = VK_NULL_HANDLE;
  44. GpuMemoryHandle m_memHandle;
  45. VkMemoryPropertyFlags m_memoryFlags = 0;
  46. PtrSize m_actualSize = 0;
  47. PtrSize m_mappedMemoryRangeAlignment = 0; ///< Cache this value.
  48. Bool m_needsFlush : 1 = false;
  49. Bool m_needsInvalidate : 1 = false;
  50. mutable GrHashMap<U64, VkBufferView> m_views; ///< Only for texture buffers.
  51. mutable RWMutex m_viewsMtx;
  52. #if ANKI_ASSERTIONS_ENABLED
  53. Bool m_mapped = false;
  54. mutable Atomic<U32> m_flushCount = {0};
  55. mutable Atomic<U32> m_invalidateCount = {0};
  56. #endif
  57. Bool isCreated() const
  58. {
  59. return m_handle != VK_NULL_HANDLE;
  60. }
  61. static VkPipelineStageFlags computePplineStage(BufferUsageBit usage);
  62. static VkAccessFlags computeAccessMask(BufferUsageBit usage);
  63. ANKI_FORCE_INLINE VkMappedMemoryRange setVkMappedMemoryRange(PtrSize offset, PtrSize range) const
  64. {
  65. // First the offset
  66. ANKI_ASSERT(offset < m_size);
  67. offset += m_memHandle.m_offset; // Move from buffer offset to memory offset
  68. alignRoundDown(m_mappedMemoryRangeAlignment, offset);
  69. // And the range
  70. range = (range == kMaxPtrSize) ? m_actualSize : range;
  71. alignRoundUp(m_mappedMemoryRangeAlignment, range);
  72. ANKI_ASSERT(offset + range <= m_memHandle.m_offset + m_actualSize);
  73. VkMappedMemoryRange vkrange = {};
  74. vkrange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
  75. vkrange.memory = m_memHandle.m_memory;
  76. vkrange.offset = offset;
  77. vkrange.size = range;
  78. return vkrange;
  79. }
  80. };
  81. /// @}
  82. } // end namespace anki