mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 04:30:10 +01:00
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:
parent
1b8b14172f
commit
5159f406d8
2 changed files with 12 additions and 23 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue