MCPcopy Create free account
hub / github.com/defold/defold / CreateDeviceBuffer

Function CreateDeviceBuffer

engine/graphics/src/vulkan/graphics_vulkan_device.cpp:712–770  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

710 }
711
712 VkResult CreateDeviceBuffer(VkPhysicalDevice vk_physical_device, VkDevice vk_device,
713 VkDeviceSize vk_size, VkMemoryPropertyFlags vk_memory_flags, DeviceBuffer* bufferOut)
714 {
715 assert(vk_size < 0x80000000); // must match max bit count in graphics_vulkan_private.h
716
717 VkBufferCreateInfo vk_buffer_create_info;
718 memset(&vk_buffer_create_info, 0, sizeof(vk_buffer_create_info));
719
720 vk_buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
721 vk_buffer_create_info.size = vk_size;
722 vk_buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
723 vk_buffer_create_info.usage = bufferOut->m_Usage;
724
725 VkResult res = vkCreateBuffer(vk_device, &vk_buffer_create_info, 0, &bufferOut->m_Handle.m_Buffer);
726 if (res != VK_SUCCESS)
727 {
728 return res;
729 }
730
731 // Allocate GPU memory to hold buffer
732 VkMemoryRequirements vk_buffer_memory_req;
733 vkGetBufferMemoryRequirements(vk_device, bufferOut->m_Handle.m_Buffer, &vk_buffer_memory_req);
734
735 VkMemoryAllocateInfo vk_memory_alloc_info;
736 memset(&vk_memory_alloc_info, 0, sizeof(vk_memory_alloc_info));
737
738 vk_memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
739 vk_memory_alloc_info.allocationSize = vk_buffer_memory_req.size;
740 vk_memory_alloc_info.memoryTypeIndex = 0;
741
742 uint32_t memory_type_index = 0;
743 if (!GetMemoryTypeIndex(vk_physical_device, vk_buffer_memory_req.memoryTypeBits, vk_memory_flags, &memory_type_index))
744 {
745 res = VK_ERROR_INITIALIZATION_FAILED;
746 goto bail;
747 }
748
749 vk_memory_alloc_info.memoryTypeIndex = memory_type_index;
750
751 res = vkAllocateMemory(vk_device, &vk_memory_alloc_info, 0, &bufferOut->m_Handle.m_Memory);
752 if (res != VK_SUCCESS)
753 {
754 goto bail;
755 }
756
757 res = vkBindBufferMemory(vk_device, bufferOut->m_Handle.m_Buffer, bufferOut->m_Handle.m_Memory, 0);
758 if (res != VK_SUCCESS)
759 {
760 return res;
761 }
762
763 bufferOut->m_MemorySize = (size_t) vk_buffer_memory_req.size;
764 bufferOut->m_Destroyed = 0;
765
766 return VK_SUCCESS;
767bail:
768 DestroyDeviceBuffer(vk_device, &bufferOut->m_Handle);
769 return res;

Callers 6

DeviceBufferUploadHelperFunction · 0.70
VulkanNewUniformBufferFunction · 0.70
CopyToTextureFunction · 0.70
AsyncProcessCallbackFunction · 0.70
VulkanReadPixelsFunction · 0.70
CreateScratchBufferFunction · 0.70

Calls 3

GetMemoryTypeIndexFunction · 0.85
DestroyDeviceBufferFunction · 0.85
assertFunction · 0.50

Tested by

no test coverage detected