17 VkVertexInputBindingDescription mainBinding = {};
20 mainBinding.inputRate = vertBinding.
_perVertexInputRate ? VK_VERTEX_INPUT_RATE_VERTEX : VK_VERTEX_INPUT_RATE_INSTANCE;
22 description.
bindings.push_back( mainBinding );
33 VkVertexInputAttributeDescription attribute = {};
35 attribute.location = idx;
52 if (
_buffer != VK_NULL_HANDLE )
63 const size_t alignedBufferSize,
64 const size_t ringQueueLength,
65 std::pair<bufferPtr, size_t> initialData,
66 const char* bufferName ) noexcept
68 , _alignedBufferSize( alignedBufferSize )
69 , _totalBufferSize( _alignedBufferSize * ringQueueLength )
71 _lockManager = std::make_unique<LockManager>();
73 VkAccessFlags2 dstAccessMask = VK_ACCESS_2_NONE;
74 VkPipelineStageFlags2 dstStageMask = VK_PIPELINE_STAGE_2_NONE;
76 VkBufferUsageFlags usageFlags = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
78 switch ( _params._flags._usageType )
82 usageFlags |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
83 usageFlags &= ~VK_BUFFER_USAGE_TRANSFER_DST_BIT;
84 dstAccessMask = VK_ACCESS_2_HOST_READ_BIT;
85 dstStageMask = VK_PIPELINE_STAGE_2_NONE;
89 usageFlags |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
90 dstAccessMask = VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT;
91 dstStageMask = VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT;
95 usageFlags |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
96 dstAccessMask = VK_ACCESS_2_INDEX_READ_BIT;
97 dstStageMask = VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT;
101 usageFlags |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
102 dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT;
103 dstStageMask = VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
107 usageFlags |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
108 dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT;
109 dstStageMask = VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT;
113 usageFlags |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
114 usageFlags |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
115 dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT | VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT;
116 dstStageMask = VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT;
122 VmaAllocationCreateInfo vmaallocInfo{};
123 vmaallocInfo.usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE;
124 vmaallocInfo.flags = 0;
130 vmaallocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;
132 else if ( _params._hostVisible )
134 vmaallocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT;
147 VkMemoryPropertyFlags memPropFlags;
155 _isMemoryMappable = memPropFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
158 _isLockable = _isMemoryMappable;
160 Byte* mappedRange =
nullptr;
161 if (!_isMemoryMappable)
164 mappedRange = (
Byte*)_stagingBuffer->_allocInfo.pMappedData;
168 mappedRange = (
Byte*)_allocInfo.pMappedData;
171 const size_t localDataSize = initialData.second > 0 ? initialData.second : _alignedBufferSize;
172 for (
U32 i = 0u; i < ringQueueLength; ++i )
174 if ( initialData.first ==
nullptr )
176 memset( &mappedRange[i * _alignedBufferSize], 0, _alignedBufferSize );
180 memcpy( &mappedRange[i * _alignedBufferSize], initialData.first, localDataSize );
185 if ( !_isMemoryMappable )
187 const auto scopeName =
Util::StringFormat(
"Immediate Buffer Upload [ {} ]", bufferName );
192 request.dstOffset = 0u;
193 request.size = _totalBufferSize;
194 request.srcBuffer = _stagingBuffer->_buffer;
195 request.dstBuffer = _buffer;
196 request.dstAccessMask = dstAccessMask;
197 request.dstStageMask = dstStageMask;
201 }, scopeName.c_str() );
206 _stagingBuffer.reset();
216 VkAccessFlags2 dstAccessMask,
217 VkPipelineStageFlags2 dstStageMask,
221 Byte* mappedRange =
nullptr;
222 size_t mappedOffset = 0u;
234 if ( data ==
nullptr )
236 memset( &mappedRange[mappedOffset], 0, range.
_length );
240 memcpy( &mappedRange[mappedOffset], data, range.
_length );
257 request.dstAccessMask = dstAccessMask;
258 request.dstStageMask = dstStageMask;
282 Byte* mappedRange = (
Byte*)mappedData;
292 VMABuffer_uptr
createStagingBuffer(
const size_t size,
const std::string_view bufferName,
const bool isCopySource )
298 params._elementCount = 1u;
299 params._elementSize = size;
301 VMABuffer_uptr ret = std::make_unique<VMABuffer>( params );
303 VmaAllocationCreateInfo vmaallocInfo = {};
305 vmaallocInfo.usage = VMA_MEMORY_USAGE_AUTO;
306 vmaallocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT;
309 const VkBufferCreateInfo bufferInfo =
vk::bufferCreateInfo( isCopySource ? VK_BUFFER_USAGE_TRANSFER_DST_BIT : VK_BUFFER_USAGE_TRANSFER_SRC_BIT, size );
317 &ret->_allocInfo ) );
static void RegisterTransferRequest(const VKTransferQueue::TransferRequest &request)
static void RegisterCustomAPIDelete(DELEGATE< void, VkDevice > &&cbk, bool isResourceTransient)
static VKStateTracker & GetStateTracker() noexcept
static void SubmitTransferRequest(const VKTransferQueue::TransferRequest &request, VkCommandBuffer cmd)
void SetObjectName(VkDevice device, uint64_t object, VkObjectType objectType, const char *name)
Str StringFormat(const char *fmt, Args &&...args)
VMABuffer_uptr createStagingBuffer(size_t size, std::string_view bufferName, const bool isCopySource)
VkFormat InternalFormat(GFXImageFormat baseFormat, GFXDataFormat dataType, GFXImagePacking packing) noexcept
VkBufferCreateInfo bufferCreateInfo()
Handle console commands that start with a forward slash.
std::lock_guard< mutex > LockGuard
constexpr U32 to_U32(const T value)
VertexInputDescription getVertexDescription(const AttributeMap &vertexFormat)
constexpr auto to_base(const Type value) -> Type
VertexBindings _vertexBindings
BufferUsageType _usageType
void flushCommandBuffer(FlushCallback &&function, const char *scopeName)
VKImmediateCmdContext * IMCmdContext(QueueType type) const
VmaAllocationInfo _allocInfo
VMABuffer(BufferParams params)
VmaAllocation _allocation
BufferLock writeBytes(BufferRange range, VkAccessFlags2 dstAccessMask, VkPipelineStageFlags2 dstStageMask, const bufferPtr data)
VMABuffer_uptr _stagingBuffer
vkBufferImpl(const BufferParams ¶ms, size_t alignedBufferSize, size_t ringQueueLength, std::pair< bufferPtr, size_t > initialData, const char *bufferName) noexcept
void readBytes(BufferRange range, std::pair< bufferPtr, size_t > outData)