SpiecsEngine
 
Loading...
Searching...
No Matches

◆ CreateBuffer()

void Spices::VulkanBuffer::CreateBuffer ( VulkanState & vulkanState,
const std::string & name,
VkDeviceSize size,
VkBufferUsageFlags usage,
VkMemoryPropertyFlags properties )
private

Create a buffer.

Parameters
[in]vulkanStateThe global VulkanState.
[in]nameBuffer name
[in]sizeThe buffer size.
[in]usageThe buffer usage.
[in]propertiesThe buffer memory requirement flags.

Instance a VkBufferCreateInfo.

Instance a VmaAllocationCreateInfo.

Create a Buffer.

Instance a VkBufferDeviceAddressInfo.

Get Address and return it.

Instance a VkBufferCreateInfo.

Instance a VmaAllocationCreateInfo.

Create a Buffer.

Instance a VkBufferDeviceAddressInfo.

Get Address and return it.

Definition at line 244 of file VulkanBuffer.cpp.

251 {
253
254 m_Name = name;
255 m_DeviceSize = size;
256 m_Usage = usage;
257 m_Flags = properties;
258
262 VkBufferCreateInfo bufferInfo{};
263 bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
264 bufferInfo.size = size;
265 bufferInfo.usage = usage;
266 bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
267
268#if VMA_ALLOCATOR
269
273 VmaAllocationCreateInfo allocInfo{};
274 allocInfo.usage = VMA_MEMORY_USAGE_AUTO;
275
276 if (properties & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
277 {
278 allocInfo.flags |= VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT;
279 }
280
282 {
283 allocInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;
284 }
285
289 VK_CHECK(vmaCreateBuffer(vulkanState.m_VmaAllocator, &bufferInfo, &allocInfo, &m_Buffer, &m_Alloc, nullptr))
290 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_BUFFER, (uint64_t)m_Buffer, vulkanState.m_Device, name)
291
292 if (usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)
293 {
297 VkBufferDeviceAddressInfo info {};
298 info.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
299 info.buffer = m_Buffer;
300
304 m_BufferAddress = vkGetBufferDeviceAddress(m_VulkanState.m_Device, &info);
305 }
306
307#else
308
312 VK_CHECK(vkCreateBuffer(vulkanState.m_Device, &bufferInfo, nullptr, &m_Buffer));
313 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_BUFFER, (uint64_t)m_Buffer, vulkanState.m_Device, "Buffer")
314
315
318 VkMemoryDedicatedRequirements dedicatedRegs{};
319 dedicatedRegs.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS;
320
321 VkMemoryRequirements2 memReqs{};
322 memReqs.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
323 memReqs.pNext = &dedicatedRegs;
324
325 VkBufferMemoryRequirementsInfo2 bufferReqs{};
326 bufferReqs.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2;
327 bufferReqs.buffer = m_Buffer;
328
329 vkGetBufferMemoryRequirements2(m_VulkanState.m_Device, &bufferReqs, &memReqs);
330
334 VkMemoryAllocateInfo allocInfo{};
335 allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
336 allocInfo.allocationSize = memReqs.memoryRequirements.size;
337
341 VkMemoryAllocateFlagsInfoKHR flagsInfo{};
342 flagsInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR;
343 flagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT;
344
345 if (usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)
346 {
347 allocInfo.pNext = &flagsInfo;
348 }
349
353 VkPhysicalDeviceMemoryProperties memProperties{};
354 vkGetPhysicalDeviceMemoryProperties(vulkanState.m_PhysicalDevice, &memProperties);
355
359 for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++)
360 {
361 if (memReqs.memoryRequirements.memoryTypeBits & (1 << i) && (memProperties.memoryTypes[i].propertyFlags & properties) == properties)
362 {
363 allocInfo.memoryTypeIndex = i;
364 break;
365 }
366 }
367
371 VK_CHECK(vkAllocateMemory(vulkanState.m_Device, &allocInfo, nullptr, &m_BufferMemory));
372 VK_CHECK(vkBindBufferMemory(vulkanState.m_Device, m_Buffer, m_BufferMemory, 0));
373
374 if (usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT)
375 {
379 VkBufferDeviceAddressInfo info {};
380 info.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
381 info.buffer = m_Buffer;
382
386 m_BufferAddress = vkGetBufferDeviceAddress(m_VulkanState.m_Device, &info);
387 }
388
389#endif
390
391 }
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
Definition VulkanUtils.h:68
VkBufferUsageFlags m_Usage
The buffer usage.
VkMemoryPropertyFlags m_Flags
The buffer memory requirement flags.
VkBuffer m_Buffer
The buffer this class handled.
VmaAllocation m_Alloc
VMA allocation.
VkDeviceSize m_DeviceSize
The buffer size.
std::string m_Name
Buffer Name.
VkDeviceAddress m_BufferAddress
The buffer gpu address.
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.
@ VMA_MEMORY_PROPERTY_DEDICATED_MEMORY_BIT
VkMemoryPropertyFlagBits.

References m_Name.