X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fvulkan%2Fwsi%2Fwsi_common_wayland.c;h=5c72c8aa2364b68bc997d095ade878111761d3aa;hb=56901c9ea4d419aad68fd75b0e89aff600730587;hp=76917442fb1b9ed6cd548ba38172dc1f5ffb20d0;hpb=4fa0ca80eeeac813affcbb0129ed61f1534d8df0;p=mesa.git diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index 76917442fb1..5c72c8aa236 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -22,7 +22,6 @@ */ #include -#include #include #include @@ -32,13 +31,15 @@ #include #include +#include "util/vk_util.h" #include "wsi_common_wayland.h" +#include "wayland-drm-client-protocol.h" #include #include #define typed_memcpy(dest, src, count) ({ \ - static_assert(sizeof(*src) == sizeof(*dest), ""); \ + STATIC_ASSERT(sizeof(*src) == sizeof(*dest)); \ memcpy((dest), (src), (count) * sizeof(*(src))); \ }) @@ -351,6 +352,8 @@ wsi_wl_surface_get_support(VkIcdSurfaceBase *surface, struct wsi_device *wsi_device, const VkAllocationCallbacks *alloc, uint32_t queueFamilyIndex, + int local_fd, + bool can_handle_different_gpu, VkBool32* pSupported) { *pSupported = true; @@ -379,7 +382,8 @@ wsi_wl_surface_get_capabilities(VkIcdSurfaceBase *surface, caps->currentExtent = (VkExtent2D) { -1, -1 }; caps->minImageExtent = (VkExtent2D) { 1, 1 }; - caps->maxImageExtent = (VkExtent2D) { INT16_MAX, INT16_MAX }; + /* This is the maximum supported size on Intel */ + caps->maxImageExtent = (VkExtent2D) { 1 << 14, 1 << 14 }; caps->supportedTransforms = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; caps->currentTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; caps->maxImageArrayLayers = 1; @@ -409,26 +413,17 @@ wsi_wl_surface_get_formats(VkIcdSurfaceBase *icd_surface, if (!display) return VK_ERROR_OUT_OF_HOST_MEMORY; - uint32_t count = u_vector_length(&display->formats); + VK_OUTARRAY_MAKE(out, pSurfaceFormats, pSurfaceFormatCount); - if (pSurfaceFormats == NULL) { - *pSurfaceFormatCount = count; - return VK_SUCCESS; - } - - assert(*pSurfaceFormatCount >= count); - *pSurfaceFormatCount = count; - - VkFormat *f; - u_vector_foreach(f, &display->formats) { - *(pSurfaceFormats++) = (VkSurfaceFormatKHR) { - .format = *f, - /* TODO: We should get this from the compositor somehow */ - .colorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR, - }; + VkFormat *disp_fmt; + u_vector_foreach(disp_fmt, &display->formats) { + vk_outarray_append(&out, out_fmt) { + out_fmt->format = *disp_fmt; + out_fmt->colorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; + } } - return VK_SUCCESS; + return vk_outarray_status(&out); } static VkResult @@ -441,11 +436,13 @@ wsi_wl_surface_get_present_modes(VkIcdSurfaceBase *surface, return VK_SUCCESS; } - assert(*pPresentModeCount >= ARRAY_SIZE(present_modes)); + *pPresentModeCount = MIN2(*pPresentModeCount, ARRAY_SIZE(present_modes)); typed_memcpy(pPresentModes, present_modes, *pPresentModeCount); - *pPresentModeCount = ARRAY_SIZE(present_modes); - return VK_SUCCESS; + if (*pPresentModeCount < ARRAY_SIZE(present_modes)) + return VK_INCOMPLETE; + else + return VK_SUCCESS; } VkResult wsi_create_wl_surface(const VkAllocationCallbacks *pAllocator, @@ -463,7 +460,7 @@ VkResult wsi_create_wl_surface(const VkAllocationCallbacks *pAllocator, surface->display = pCreateInfo->display; surface->surface = pCreateInfo->surface; - *pSurface = _VkIcdSurfaceBase_to_handle(&surface->base); + *pSurface = VkIcdSurfaceBase_to_handle(&surface->base); return VK_SUCCESS; } @@ -481,6 +478,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; @@ -489,7 +487,6 @@ struct wsi_wl_swapchain { VkPresentModeKHR present_mode; bool fifo_ready; - uint32_t image_count; struct wsi_wl_image images[0]; }; @@ -498,19 +495,25 @@ wsi_wl_swapchain_get_images(struct wsi_swapchain *wsi_chain, uint32_t *pCount, VkImage *pSwapchainImages) { struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain; + uint32_t ret_count; + VkResult result; if (pSwapchainImages == NULL) { - *pCount = chain->image_count; + *pCount = chain->base.image_count; return VK_SUCCESS; } - assert(chain->image_count <= *pCount); - for (uint32_t i = 0; i < chain->image_count; i++) - pSwapchainImages[i] = chain->images[i].image; + result = VK_SUCCESS; + ret_count = chain->base.image_count; + if (chain->base.image_count > *pCount) { + ret_count = *pCount; + result = VK_INCOMPLETE; + } - *pCount = chain->image_count; + for (uint32_t i = 0; i < ret_count; i++) + pSwapchainImages[i] = chain->images[i].image; - return VK_SUCCESS; + return result; } static VkResult @@ -531,7 +534,7 @@ wsi_wl_swapchain_acquire_next_image(struct wsi_swapchain *wsi_chain, return VK_ERROR_OUT_OF_DATE_KHR; while (1) { - for (uint32_t i = 0; i < chain->image_count; i++) { + for (uint32_t i = 0; i < chain->base.image_count; i++) { if (!chain->images[i].busy) { /* We found a non-busy image */ *image_index = i; @@ -566,7 +569,8 @@ static const struct wl_callback_listener frame_listener = { static VkResult wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain, - uint32_t image_index) + uint32_t image_index, + const VkPresentRegionKHR *damage) { struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain; @@ -579,9 +583,21 @@ wsi_wl_swapchain_queue_present(struct wsi_swapchain *wsi_chain, } } - assert(image_index < chain->image_count); + 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); @@ -626,6 +642,8 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain, result = chain->base.image_fns->create_wsi_image(vk_device, pCreateInfo, pAllocator, + false, + false, &image->image, &image->memory, &size, @@ -667,7 +685,7 @@ wsi_wl_swapchain_destroy(struct wsi_swapchain *wsi_chain, { struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain; - for (uint32_t i = 0; i < chain->image_count; i++) { + for (uint32_t i = 0; i < chain->base.image_count; i++) { if (chain->images[i].buffer) chain->base.image_fns->free_wsi_image(chain->base.device, pAllocator, chain->images[i].image, @@ -683,6 +701,7 @@ static VkResult wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, VkDevice device, struct wsi_device *wsi_device, + int local_fd, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, const struct wsi_image_fns *image_fns, @@ -712,19 +731,20 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, chain->base.queue_present = wsi_wl_swapchain_queue_present; chain->base.image_fns = image_fns; chain->base.present_mode = pCreateInfo->presentMode; + 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); chain->fifo_ready = true; - chain->image_count = num_images; - /* Mark a bunch of stuff as NULL. This way we can just call * destroy_swapchain for cleanup. */ - for (uint32_t i = 0; i < chain->image_count; i++) + for (uint32_t i = 0; i < chain->base.image_count; i++) chain->images[i].buffer = NULL; chain->queue = NULL; @@ -741,7 +761,7 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, goto fail; } - for (uint32_t i = 0; i < chain->image_count; i++) { + for (uint32_t i = 0; i < chain->base.image_count; i++) { result = wsi_wl_image_init(chain, &chain->images[i], pCreateInfo, pAllocator); if (result != VK_SUCCESS)