auto barrier in pipeline and copy command

This commit is contained in:
nihuini
2019-03-13 17:33:36 +08:00
parent 2672cd437f
commit 433a92401a
36 changed files with 35 additions and 127 deletions
+21
View File
@@ -183,6 +183,8 @@ VkCompute::~VkCompute()
void VkCompute::record_upload(const VkMat& m)
{
record_prepare_transfer_barrier(m);
if (vkdev->info.support_VK_KHR_push_descriptor)
return copy_buffer(m.staging_buffer(), 0, m.buffer(), m.buffer_offset(), m.total() * m.elemsize);
@@ -198,6 +200,8 @@ void VkCompute::record_upload(const VkMat& m)
void VkCompute::record_download(const VkMat& m)
{
record_prepare_transfer_barrier(m);
if (vkdev->info.support_VK_KHR_push_descriptor)
return copy_buffer(m.buffer(), m.buffer_offset(), m.staging_buffer(), 0, m.total() * m.elemsize);
@@ -213,6 +217,8 @@ void VkCompute::record_download(const VkMat& m)
void VkCompute::record_clone(const VkMat& src, const VkMat& dst)
{
record_prepare_transfer_barrier(src);
if (vkdev->info.support_VK_KHR_push_descriptor)
return copy_buffer(src.buffer(), src.buffer_offset(), dst.buffer(), dst.buffer_offset(), src.total() * src.elemsize);
@@ -236,6 +242,8 @@ void VkCompute::record_copy_region(const VkMat& src, const VkMat& dst, const VkB
void VkCompute::record_copy_regions(const VkMat& src, const VkMat& dst, const std::vector<VkBufferCopy>& regions)
{
record_prepare_transfer_barrier(src);
if (vkdev->info.support_VK_KHR_push_descriptor)
return copy_buffer_regions(src.buffer(), dst.buffer(), regions);
@@ -249,6 +257,16 @@ void VkCompute::record_copy_regions(const VkMat& src, const VkMat& dst, const st
void VkCompute::record_pipeline(const Pipeline* pipeline, const std::vector<VkMat>& bindings, const std::vector<vk_constant_type>& constants, const VkMat& m)
{
const int binding_count = bindings.size();
for (int i=0; i<binding_count; i++)
{
// skip readonly weight blob
if (bindings[i].data->state == 4)
continue;
record_prepare_compute_barrier(bindings[i]);
}
record_bind_pipeline(pipeline->pipeline);
record_update_bindings(pipeline->pipeline_layout, pipeline->descriptorset_layout, pipeline->descriptor_update_template, bindings);
@@ -715,6 +733,9 @@ void VkTransfer::record_upload(const Mat& src, VkMat& dst)
{
dst.create_like(src, weight_vkallocator, staging_vkallocator);
// set weight blob as readonly
dst.data->state = 4;
if (dst.allocator->mappable)
{
dst.upload(src);