mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 02:20:11 +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)
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue