From cd881dafad9bdb5a8f94ae272c56c7e30ee28d09 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 15 Nov 2017 20:08:53 -0800 Subject: [PATCH] vulkan/wsi: Add wsi_swapchain_init/finish functions Reviewed-by: Dave Airlie Reviewed-by: Chad Versace --- src/vulkan/Makefile.sources | 1 + src/vulkan/wsi/meson.build | 1 + src/vulkan/wsi/wsi_common.c | 23 ++++++++++++++++++++++- src/vulkan/wsi/wsi_common.h | 1 + src/vulkan/wsi/wsi_common_private.h | 37 +++++++++++++++++++++++++++++++++++++ src/vulkan/wsi/wsi_common_wayland.c | 11 ++++++++++- src/vulkan/wsi/wsi_common_x11.c | 13 +++++++++++-- 7 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 src/vulkan/wsi/wsi_common_private.h diff --git a/src/vulkan/Makefile.sources b/src/vulkan/Makefile.sources index 44cba8b..6e9a09c 100644 --- a/src/vulkan/Makefile.sources +++ b/src/vulkan/Makefile.sources @@ -2,6 +2,7 @@ VULKAN_WSI_FILES := \ wsi/wsi_common.c \ wsi/wsi_common.h \ + wsi/wsi_common_private.h \ wsi/wsi_common_queue.h VULKAN_WSI_WAYLAND_FILES := \ diff --git a/src/vulkan/wsi/meson.build b/src/vulkan/wsi/meson.build index bfec376..bd0fd3c 100644 --- a/src/vulkan/wsi/meson.build +++ b/src/vulkan/wsi/meson.build @@ -24,6 +24,7 @@ vulkan_wsi_deps = [] files_vulkan_wsi = files( 'wsi_common.c', 'wsi_common.h', + 'wsi_common_private.h', 'wsi_common_queue.h', ) if with_platform_x11 diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 8c883b4..bb35237 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -21,7 +21,7 @@ * IN THE SOFTWARE. */ -#include "wsi_common.h" +#include "wsi_common_private.h" void wsi_device_init(struct wsi_device *wsi, @@ -30,3 +30,24 @@ wsi_device_init(struct wsi_device *wsi, { memset(wsi, 0, sizeof(*wsi)); } + +VkResult +wsi_swapchain_init(const struct wsi_device *wsi, + struct wsi_swapchain *chain, + VkDevice device, + const VkSwapchainCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks *pAllocator) +{ + memset(chain, 0, sizeof(*chain)); + + chain->wsi = wsi; + chain->device = device; + chain->alloc = *pAllocator; + + return VK_SUCCESS; +} + +void +wsi_swapchain_finish(struct wsi_swapchain *chain) +{ +} diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index 41d2c6d..15142f3 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -53,6 +53,7 @@ struct wsi_image_fns { }; struct wsi_swapchain { + const struct wsi_device *wsi; VkDevice device; VkAllocationCallbacks alloc; diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h new file mode 100644 index 0000000..d178df7 --- /dev/null +++ b/src/vulkan/wsi/wsi_common_private.h @@ -0,0 +1,37 @@ +/* + * Copyright © 2017 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ +#ifndef WSI_COMMON_PRIVATE_H +#define WSI_COMMON_PRIVATE_H + +#include "wsi_common.h" + +VkResult +wsi_swapchain_init(const struct wsi_device *wsi, + struct wsi_swapchain *chain, + VkDevice device, + const VkSwapchainCreateInfoKHR *pCreateInfo, + const VkAllocationCallbacks *pAllocator); + +void wsi_swapchain_finish(struct wsi_swapchain *chain); + +#endif /* WSI_COMMON_PRIVATE_H */ diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index c7c7da6..b75a4d0 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -32,6 +32,7 @@ #include #include "vk_util.h" +#include "wsi_common_private.h" #include "wsi_common_wayland.h" #include "wayland-drm-client-protocol.h" @@ -783,6 +784,8 @@ wsi_wl_swapchain_destroy(struct wsi_swapchain *wsi_chain, if (chain->display) wsi_wl_display_unref(chain->display); + wsi_swapchain_finish(&chain->base); + vk_free(pAllocator, chain); return VK_SUCCESS; @@ -814,6 +817,13 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, if (chain == NULL) return VK_ERROR_OUT_OF_HOST_MEMORY; + result = wsi_swapchain_init(wsi_device, &chain->base, device, + pCreateInfo, pAllocator); + if (result != VK_SUCCESS) { + vk_free(pAllocator, chain); + return result; + } + /* Mark a bunch of stuff as NULL. This way we can just call * destroy_swapchain for cleanup. */ @@ -826,7 +836,6 @@ wsi_wl_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, bool alpha = pCreateInfo->compositeAlpha == VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR; - chain->base.device = device; chain->base.destroy = wsi_wl_swapchain_destroy; chain->base.get_images = wsi_wl_swapchain_get_images; chain->base.acquire_next_image = wsi_wl_swapchain_acquire_next_image; diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 51c103e..c6d1f02 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -39,7 +39,7 @@ #include "util/hash_table.h" #include "vk_util.h" -#include "wsi_common.h" +#include "wsi_common_private.h" #include "wsi_common_x11.h" #include "wsi_common_queue.h" @@ -1084,6 +1084,8 @@ x11_swapchain_destroy(struct wsi_swapchain *anv_chain, XCB_PRESENT_EVENT_MASK_NO_EVENT); xcb_discard_reply(chain->conn, cookie.sequence); + wsi_swapchain_finish(&chain->base); + vk_free(pAllocator, chain); return VK_SUCCESS; @@ -1123,7 +1125,11 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, if (chain == NULL) return VK_ERROR_OUT_OF_HOST_MEMORY; - chain->base.device = device; + result = wsi_swapchain_init(wsi_device, &chain->base, device, + pCreateInfo, pAllocator); + if (result != VK_SUCCESS) + goto fail_alloc; + chain->base.destroy = x11_swapchain_destroy; chain->base.get_images = x11_get_images; chain->base.get_image_and_linear = x11_get_image_and_linear; @@ -1223,6 +1229,9 @@ fail_init_images: fail_register: xcb_unregister_for_special_event(chain->conn, chain->special_event); + wsi_swapchain_finish(&chain->base); + +fail_alloc: vk_free(pAllocator, chain); return result; -- 2.7.4