From 5159f406d895c6a253e90c6b076045ac133e55af Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Thu, 4 Feb 2021 11:21:35 +0100 Subject: [PATCH] zink: use gallium api to copy to display-target This allows us to avoid us to avoid forcing linear and host-visible display-targets. Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/drivers/zink/zink_resource.c | 6 +---- src/gallium/drivers/zink/zink_screen.c | 29 +++++++++--------------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 43c964c8a5b..4a0364d05b8 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -217,9 +217,6 @@ resource_create(struct pipe_screen *pscreen, templ->target == PIPE_TEXTURE_CUBE_ARRAY) ici.arrayLayers *= 6; - if (screen->winsys && templ->bind & PIPE_BIND_DISPLAY_TARGET) - ici.tiling = VK_IMAGE_TILING_LINEAR; - if (templ->bind & PIPE_BIND_SHARED) { emici.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO; emici.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; @@ -285,8 +282,7 @@ resource_create(struct pipe_screen *pscreen, res->aspect = aspect_from_format(templ->format); vkGetImageMemoryRequirements(screen->dev, res->image, &reqs); - if (templ->usage == PIPE_USAGE_STAGING || - (screen->winsys && (templ->bind & PIPE_BIND_DISPLAY_TARGET))) + if (templ->usage == PIPE_USAGE_STAGING) flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; else flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 271f70c28e3..9f6f66ad5ec 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -849,25 +849,18 @@ zink_flush_frontbuffer(struct pipe_screen *pscreen, void *map = winsys->displaytarget_map(winsys, res->dt, 0); if (map) { - VkImageSubresource isr = {}; - isr.aspectMask = res->aspect; - isr.mipLevel = level; - isr.arrayLayer = layer; - VkSubresourceLayout layout; - vkGetImageSubresourceLayout(screen->dev, res->image, &isr, &layout); - - void *ptr; - VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, res->size, 0, &ptr); - if (result != VK_SUCCESS) { - debug_printf("failed to map memory for display\n"); - return; + struct pipe_transfer *transfer = NULL; + void *res_map = pipe_transfer_map(pcontext, pres, level, layer, PIPE_MAP_READ, 0, 0, + u_minify(pres->width0, level), + u_minify(pres->height0, level), + &transfer); + if (res_map) { + util_copy_rect((ubyte*)map, pres->format, res->dt_stride, 0, 0, + transfer->box.width, transfer->box.height, + (const ubyte*)res_map, transfer->stride, 0, 0); + pipe_transfer_unmap(pcontext, transfer); } - for (int i = 0; i < pres->height0; ++i) { - uint8_t *src = (uint8_t *)ptr + i * layout.rowPitch; - uint8_t *dst = (uint8_t *)map + i * res->dt_stride; - memcpy(dst, src, res->dt_stride); - } - vkUnmapMemory(screen->dev, res->mem); + winsys->displaytarget_unmap(winsys, res->dt); } winsys->displaytarget_unmap(winsys, res->dt);