| 131 | /* ----- Buffers ------ */ |
| 132 | |
| 133 | Buffer* VKRenderSystem::CreateBuffer(const BufferDescriptor& desc, const void* initialData) |
| 134 | { |
| 135 | AssertCreateBuffer(desc, static_cast<uint64_t>(std::numeric_limits<VkDeviceSize>::max())); |
| 136 | |
| 137 | /* Create staging buffer */ |
| 138 | VkBufferCreateInfo stagingCreateInfo; |
| 139 | BuildVkBufferCreateInfo( |
| 140 | stagingCreateInfo, |
| 141 | static_cast<VkDeviceSize>(desc.size), |
| 142 | GetStagingVkBufferUsageFlags(desc.cpuAccessFlags) |
| 143 | ); |
| 144 | |
| 145 | auto stagingBuffer = CreateStagingBuffer(stagingCreateInfo, initialData, desc.size); |
| 146 | |
| 147 | /* Create primary buffer object */ |
| 148 | auto buffer = TakeOwnership(buffers_, MakeUnique<VKBuffer>(device_, desc)); |
| 149 | |
| 150 | /* Allocate device memory */ |
| 151 | auto memoryRegion = deviceMemoryMngr_->Allocate( |
| 152 | buffer->GetDeviceBuffer().GetRequirements(), |
| 153 | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
| 154 | ); |
| 155 | buffer->BindMemoryRegion(device_, memoryRegion); |
| 156 | |
| 157 | /* Copy staging buffer into hardware buffer */ |
| 158 | device_.CopyBuffer(stagingBuffer.GetVkBuffer(), buffer->GetVkBuffer(), static_cast<VkDeviceSize>(desc.size)); |
| 159 | |
| 160 | if (desc.cpuAccessFlags != 0 || (desc.miscFlags & MiscFlags::DynamicUsage) != 0) |
| 161 | { |
| 162 | /* Store ownership of staging buffer */ |
| 163 | buffer->TakeStagingBuffer(std::move(stagingBuffer)); |
| 164 | } |
| 165 | else |
| 166 | { |
| 167 | /* Release staging buffer */ |
| 168 | stagingBuffer.ReleaseMemoryRegion(*deviceMemoryMngr_); |
| 169 | } |
| 170 | |
| 171 | return buffer; |
| 172 | } |
| 173 | |
| 174 | BufferArray* VKRenderSystem::CreateBufferArray(std::uint32_t numBuffers, Buffer* const * bufferArray) |
| 175 | { |