diff options
author | Jason Ekstrand <[email protected]> | 2017-01-24 15:29:43 -0800 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-04-03 13:51:08 -0700 |
commit | be1ecd8c6e3fbc20f62870c52b8e95ab2a5931ee (patch) | |
tree | d932aacecac9a25a5573bb0c050321fd163d9b6f /src | |
parent | f82b6c6272b48b4ce1f267239fa5b1cd3dfffcc7 (diff) |
vulkan/wsi/wayland: Pass damage through to the compositor
Reviewed-by: Lionel Landwerlin <[email protected]>
Reviewed-by: Daniel Stone <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/vulkan/wsi/wsi_common_wayland.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index 26a137c1a0d..5613283d9d9 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -488,6 +488,7 @@ struct wsi_wl_swapchain { struct wsi_wl_display * display; struct wl_event_queue * queue; struct wl_surface * surface; + uint32_t surface_version; VkExtent2D extent; VkFormat vk_format; @@ -594,7 +595,19 @@ wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain, assert(image_index < chain->base.image_count); wl_surface_attach(chain->surface, chain->images[image_index].buffer, 0, 0); - wl_surface_damage(chain->surface, 0, 0, INT32_MAX, INT32_MAX); + + if (chain->surface_version >= 4 && damage && + damage->pRectangles && damage->rectangleCount > 0) { + for (unsigned i = 0; i < damage->rectangleCount; i++) { + const VkRectLayerKHR *rect = &damage->pRectangles[i]; + assert(rect->layer == 0); + wl_surface_damage_buffer(chain->surface, + rect->offset.x, rect->offset.y, + rect->extent.width, rect->extent.height); + } + } else { + wl_surface_damage(chain->surface, 0, 0, INT32_MAX, INT32_MAX); + } if (chain->base.present_mode == VK_PRESENT_MODE_FIFO_KHR) { struct wl_callback *frame = wl_surface_frame(chain->surface); @@ -731,6 +744,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, chain->base.image_count = num_images; chain->base.needs_linear_copy = false; chain->surface = surface->surface; + chain->surface_version = wl_proxy_get_version((void *)surface->surface); chain->extent = pCreateInfo->imageExtent; chain->vk_format = pCreateInfo->imageFormat; chain->drm_format = wl_drm_format_for_vk_format(chain->vk_format, alpha); |