|
|
@@ -39,16 +39,17 @@ std::unique_ptr<VKStreamBuffer> CreateStreamBuffer(const VKDevice& device, VKSch
|
|
|
|
|
|
Buffer::Buffer(const VKDevice& device, VKMemoryManager& memory_manager, VKScheduler& scheduler_,
|
|
|
VKStagingBufferPool& staging_pool_, VAddr cpu_addr, std::size_t size)
|
|
|
- : VideoCommon::BufferBlock{cpu_addr, size}, scheduler{scheduler_}, staging_pool{staging_pool_} {
|
|
|
- VkBufferCreateInfo ci;
|
|
|
- ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
|
|
- ci.pNext = nullptr;
|
|
|
- ci.flags = 0;
|
|
|
- ci.size = static_cast<VkDeviceSize>(size);
|
|
|
- ci.usage = BUFFER_USAGE | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
|
|
|
- ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
|
|
|
- ci.queueFamilyIndexCount = 0;
|
|
|
- ci.pQueueFamilyIndices = nullptr;
|
|
|
+ : BufferBlock{cpu_addr, size}, scheduler{scheduler_}, staging_pool{staging_pool_} {
|
|
|
+ const VkBufferCreateInfo ci{
|
|
|
+ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
|
|
+ .pNext = nullptr,
|
|
|
+ .flags = 0,
|
|
|
+ .size = static_cast<VkDeviceSize>(size),
|
|
|
+ .usage = BUFFER_USAGE | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
|
|
+ .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
|
|
+ .queueFamilyIndexCount = 0,
|
|
|
+ .pQueueFamilyIndices = nullptr,
|
|
|
+ };
|
|
|
|
|
|
buffer.handle = device.GetLogical().CreateBuffer(ci);
|
|
|
buffer.commit = memory_manager.Commit(buffer.handle, false);
|
|
|
@@ -66,16 +67,17 @@ void Buffer::Upload(std::size_t offset, std::size_t size, const u8* data) {
|
|
|
scheduler.Record([staging = *staging.handle, handle, offset, size](vk::CommandBuffer cmdbuf) {
|
|
|
cmdbuf.CopyBuffer(staging, handle, VkBufferCopy{0, offset, size});
|
|
|
|
|
|
- VkBufferMemoryBarrier barrier;
|
|
|
- barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
|
|
|
- barrier.pNext = nullptr;
|
|
|
- barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
|
|
- barrier.dstAccessMask = UPLOAD_ACCESS_BARRIERS;
|
|
|
- barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
|
- barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
|
- barrier.buffer = handle;
|
|
|
- barrier.offset = offset;
|
|
|
- barrier.size = size;
|
|
|
+ const VkBufferMemoryBarrier barrier{
|
|
|
+ .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
|
|
+ .pNext = nullptr,
|
|
|
+ .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
|
|
+ .dstAccessMask = UPLOAD_ACCESS_BARRIERS,
|
|
|
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
|
|
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
|
|
+ .buffer = handle,
|
|
|
+ .offset = offset,
|
|
|
+ .size = size,
|
|
|
+ };
|
|
|
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, UPLOAD_PIPELINE_STAGE, 0, {},
|
|
|
barrier, {});
|
|
|
});
|
|
|
@@ -87,16 +89,17 @@ void Buffer::Download(std::size_t offset, std::size_t size, u8* data) {
|
|
|
|
|
|
const VkBuffer handle = Handle();
|
|
|
scheduler.Record([staging = *staging.handle, handle, offset, size](vk::CommandBuffer cmdbuf) {
|
|
|
- VkBufferMemoryBarrier barrier;
|
|
|
- barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
|
|
|
- barrier.pNext = nullptr;
|
|
|
- barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
|
|
|
- barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
|
|
|
- barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
|
- barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
|
|
- barrier.buffer = handle;
|
|
|
- barrier.offset = offset;
|
|
|
- barrier.size = size;
|
|
|
+ const VkBufferMemoryBarrier barrier{
|
|
|
+ .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
|
|
+ .pNext = nullptr,
|
|
|
+ .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
|
|
|
+ .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
|
|
|
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
|
|
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
|
|
+ .buffer = handle,
|
|
|
+ .offset = offset,
|
|
|
+ .size = size,
|
|
|
+ };
|
|
|
|
|
|
cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
|
|
|
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
|