if(src->memory_property_flags & vk::MemoryPropertyFlagBits::eHostVisible && src->device->uma) {
GGML_ASSERT(src->memory_property_flags & vk::MemoryPropertyFlagBits::eHostCoherent);
+ std::lock_guard<std::recursive_mutex> guard(src->device->mutex);
+ vk_context subctx = ggml_vk_create_temporary_context(src->device->compute_queue.cmd_pool);
+ ggml_vk_ctx_begin(src->device, subctx);
+ subctx->s->buffer->buf.pipelineBarrier(
+ vk::PipelineStageFlagBits::eComputeShader | vk::PipelineStageFlagBits::eTransfer,
+ vk::PipelineStageFlagBits::eHost,
+ {},
+ { { vk::AccessFlagBits::eShaderWrite | vk::AccessFlagBits::eTransferWrite,
+ vk::AccessFlagBits::eHostRead } },
+ {}, {});
+ ggml_vk_ctx_end(subctx);
+ ggml_vk_submit(subctx, src->device->fence);
+ VK_CHECK(src->device->device.waitForFences({ src->device->fence }, true, UINT64_MAX),
+ "vk_buffer_read_2d uma waitForFences");
+ src->device->device.resetFences({ src->device->fence });
+ ggml_vk_queue_command_pools_cleanup(src->device);
+
if (width == spitch && width == dpitch) {
memcpy(dst, (const uint8_t *) src->ptr + offset, width * height);
} else {