diff --git a/src/command.cpp b/src/command.cpp index 84a7cdfff..2fbeab67b 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -2507,7 +2507,7 @@ VkTransfer::~VkTransfer() } } -void VkTransfer::record_upload(const Mat& src, VkMat& dst, const Option& opt) +void VkTransfer::record_upload(const Mat& src, VkMat& dst, const Option& opt, bool flatten) { // NCNN_LOGE("record_upload src = %d | %d %d %d @ %d", src.dims, src.w, src.h, src.c, src.elempack); @@ -2525,7 +2525,7 @@ void VkTransfer::record_upload(const Mat& src, VkMat& dst, const Option& opt) } } - Mat src_flattened = src.reshape(src.w * src.h * src.c); + Mat src_flattened = flatten ? src.reshape(src.w * src.h * src.c) : src; // create dst dst.create_like(src_flattened, opt.blob_vkallocator); diff --git a/src/command.h b/src/command.h index c988cfa5a..ca1766194 100644 --- a/src/command.h +++ b/src/command.h @@ -181,7 +181,7 @@ public: ~VkTransfer(); public: - void record_upload(const Mat& src, VkMat& dst, const Option& opt); + void record_upload(const Mat& src, VkMat& dst, const Option& opt, bool flatten = true); void record_upload(const Mat& src, VkImageMat& dst, const Option& opt); diff --git a/src/layer/vulkan/memorydata_vulkan.cpp b/src/layer/vulkan/memorydata_vulkan.cpp index 1d1bd82d9..9db5cedc5 100644 --- a/src/layer/vulkan/memorydata_vulkan.cpp +++ b/src/layer/vulkan/memorydata_vulkan.cpp @@ -63,23 +63,17 @@ int MemoryData_vulkan::create_pipeline(const Option& opt) return 0; } -int MemoryData_vulkan::upload_model(VkTransfer& /*cmd*/, const Option& opt) +int MemoryData_vulkan::upload_model(VkTransfer& cmd, const Option& opt) { - // VkTransfer will flatten weight data - // so we use VkCompute for uploading - VkCompute cmd2(vkdev); - if (support_image_storage && opt.use_image_storage) { - cmd2.record_upload(data, data_gpu_image, opt); + cmd.record_upload(data, data_gpu_image, opt); } else { - cmd2.record_upload(data, data_gpu, opt); + cmd.record_upload(data, data_gpu, opt, /*bool flatten*/ false); } - cmd2.submit_and_wait(); - return 0; }