summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2019-02-11 17:23:56 -0800
committerKristian H. Kristensen <[email protected]>2019-04-09 00:42:30 +0000
commit2d214d940524ffb74ebbaac641ed0d798a4e39c7 (patch)
treef741227cd8623d44b740d71db75447e4e6a81504
parentab74937b2c8880d3c084f792f37c6b8d953f9e4b (diff)
vulkan/wsi: create wl_drm wrapper as needed
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 <[email protected]> Reviewed-by: Daniel Stone <[email protected]>
-rw-r--r--src/vulkan/wsi/wsi_common_wayland.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
index 16eaadffb23..362f5c21b5e 100644
--- a/src/vulkan/wsi/wsi_common_wayland.c
+++ b/src/vulkan/wsi/wsi_common_wayland.c
@@ -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;