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 <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8858>
This commit is contained in:
Erik Faye-Lund 2021-02-04 11:21:35 +01:00 committed by Marge Bot
parent 1b8b14172f
commit 5159f406d8
2 changed files with 12 additions and 23 deletions

View file

@ -217,9 +217,6 @@ resource_create(struct pipe_screen *pscreen,
templ->target == PIPE_TEXTURE_CUBE_ARRAY) templ->target == PIPE_TEXTURE_CUBE_ARRAY)
ici.arrayLayers *= 6; ici.arrayLayers *= 6;
if (screen->winsys && templ->bind & PIPE_BIND_DISPLAY_TARGET)
ici.tiling = VK_IMAGE_TILING_LINEAR;
if (templ->bind & PIPE_BIND_SHARED) { if (templ->bind & PIPE_BIND_SHARED) {
emici.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO; emici.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
emici.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT; 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); res->aspect = aspect_from_format(templ->format);
vkGetImageMemoryRequirements(screen->dev, res->image, &reqs); vkGetImageMemoryRequirements(screen->dev, res->image, &reqs);
if (templ->usage == PIPE_USAGE_STAGING || if (templ->usage == PIPE_USAGE_STAGING)
(screen->winsys && (templ->bind & PIPE_BIND_DISPLAY_TARGET)))
flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
else else
flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;

View file

@ -849,25 +849,18 @@ zink_flush_frontbuffer(struct pipe_screen *pscreen,
void *map = winsys->displaytarget_map(winsys, res->dt, 0); void *map = winsys->displaytarget_map(winsys, res->dt, 0);
if (map) { if (map) {
VkImageSubresource isr = {}; struct pipe_transfer *transfer = NULL;
isr.aspectMask = res->aspect; void *res_map = pipe_transfer_map(pcontext, pres, level, layer, PIPE_MAP_READ, 0, 0,
isr.mipLevel = level; u_minify(pres->width0, level),
isr.arrayLayer = layer; u_minify(pres->height0, level),
VkSubresourceLayout layout; &transfer);
vkGetImageSubresourceLayout(screen->dev, res->image, &isr, &layout); if (res_map) {
util_copy_rect((ubyte*)map, pres->format, res->dt_stride, 0, 0,
void *ptr; transfer->box.width, transfer->box.height,
VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, res->size, 0, &ptr); (const ubyte*)res_map, transfer->stride, 0, 0);
if (result != VK_SUCCESS) { pipe_transfer_unmap(pcontext, transfer);
debug_printf("failed to map memory for display\n");
return;
} }
for (int i = 0; i < pres->height0; ++i) { winsys->displaytarget_unmap(winsys, res->dt);
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);