vulkan/wsi: create wl_drm wrapper as needed
authorChia-I Wu <olvaffe@gmail.com>
Tue, 12 Feb 2019 01:23:56 +0000 (17:23 -0800)
committerKristian H. Kristensen <hoegsberg@gmail.com>
Tue, 9 Apr 2019 00:42:30 +0000 (00:42 +0000)
When modifiers are specified, we have to use dmabuf rather than
wl_drm.  We don't need the wrapper in that case.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
src/vulkan/wsi/wsi_common_wayland.c

index 16eaadffb23ea57201045cec51177d23b2bff41c..362f5c21b5e5c39dd1207d89c4808256b0212ce0 100644 (file)
@@ -677,7 +677,12 @@ struct wsi_wl_swapchain {
 
    struct wl_surface *                          surface;
    uint32_t                                     surface_version;
+
+   /* non-NULL when wl_drm should be used for wl_buffer creation; otherwise,
+    * zwp_linux_dmabuf_v1 should be used.
+    */
    struct wl_drm *                              drm_wrapper;
+
    struct wl_callback *                         frame;
 
    VkExtent2D                                   extent;
@@ -829,9 +834,10 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
    if (result != VK_SUCCESS)
       return result;
 
-   if (image->base.drm_modifier != DRM_FORMAT_MOD_INVALID) {
+   if (!chain->drm_wrapper) {
       /* Only request modifiers if we have dmabuf, else it must be implicit. */
       assert(display->dmabuf);
+      assert(image->base.drm_modifier != DRM_FORMAT_MOD_INVALID);
 
       struct zwp_linux_buffer_params_v1 *params =
          zwp_linux_dmabuf_v1_create_params(display->dmabuf);
@@ -858,6 +864,7 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
    } else {
       /* Without passing modifiers, we can't have multi-plane RGB images. */
       assert(image->base.num_planes == 1);
+      assert(image->base.drm_modifier == DRM_FORMAT_MOD_INVALID);
 
       image->buffer =
          wl_drm_create_prime_buffer(chain->drm_wrapper,
@@ -1015,13 +1022,19 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface,
       }
    }
 
-   chain->drm_wrapper = wl_proxy_create_wrapper(chain->display->drm);
-   if (!chain->drm_wrapper) {
-      result = VK_ERROR_OUT_OF_HOST_MEMORY;
-      goto fail;
+   /* When there are explicit DRM format modifiers, we must use
+    * zwp_linux_dmabuf_v1 for wl_buffer creation.  Otherwise, we must use
+    * wl_drm.
+    */
+   if (!chain->num_drm_modifiers) {
+      chain->drm_wrapper = wl_proxy_create_wrapper(chain->display->drm);
+      if (!chain->drm_wrapper) {
+         result = VK_ERROR_OUT_OF_HOST_MEMORY;
+         goto fail;
+      }
+      wl_proxy_set_queue((struct wl_proxy *) chain->drm_wrapper,
+                         chain->display->queue);
    }
-   wl_proxy_set_queue((struct wl_proxy *) chain->drm_wrapper,
-                      chain->display->queue);
 
    chain->fifo_ready = true;