This commit is contained in:
twinaphex 2016-02-19 11:36:46 +01:00
parent c105fb22f3
commit 7205d76ab0
2 changed files with 50 additions and 44 deletions

View File

@ -40,6 +40,12 @@
#define VULKAN_DIRTY_DYNAMIC_BIT 0x0001 #define VULKAN_DIRTY_DYNAMIC_BIT 0x0001
enum vulkan_wsi_type
{
VULKAN_WSI_NONE = 0,
VULKAN_WSI_WAYLAND
};
typedef struct vulkan_context typedef struct vulkan_context
{ {
VkInstance instance; VkInstance instance;

View File

@ -216,20 +216,19 @@ static const struct wl_registry_listener registry_listener = {
registry_handle_global_remove, registry_handle_global_remove,
}; };
static void gfx_ctx_wl_get_video_size(void *data, static void gfx_ctx_wl_get_video_size(void *data,
unsigned *width, unsigned *height); unsigned *width, unsigned *height);
#ifdef HAVE_VULKAN
static void vulkan_destroy_context(gfx_ctx_vulkan_data_t *vk,
bool destroy_surface);
#endif
static void gfx_ctx_wl_destroy_resources(gfx_ctx_wayland_data_t *wl) static void gfx_ctx_wl_destroy_resources(gfx_ctx_wayland_data_t *wl)
{ {
unsigned i;
if (!wl) if (!wl)
return; return;
(void)i;
switch (wl_api) switch (wl_api)
{ {
case GFX_CTX_OPENGL_API: case GFX_CTX_OPENGL_API:
@ -244,38 +243,7 @@ static void gfx_ctx_wl_destroy_resources(gfx_ctx_wayland_data_t *wl)
break; break;
case GFX_CTX_VULKAN_API: case GFX_CTX_VULKAN_API:
#ifdef HAVE_VULKAN #ifdef HAVE_VULKAN
if (wl->vk.context.queue) vulkan_destroy_context(&wl->vk, wl->surface);
vkQueueWaitIdle(wl->vk.context.queue);
if (wl->vk.swapchain)
wl->vk.fpDestroySwapchainKHR(wl->vk.context.device,
wl->vk.swapchain, NULL);
if (wl->surface)
wl->vk.fpDestroySurfaceKHR(wl->vk.context.instance,
wl->vk.vk_surface, NULL);
for (i = 0; i < VULKAN_MAX_SWAPCHAIN_IMAGES; i++)
{
if (wl->vk.context.swapchain_semaphores[i] != VK_NULL_HANDLE)
vkDestroySemaphore(wl->vk.context.device,
wl->vk.context.swapchain_semaphores[i], NULL);
if (wl->vk.context.swapchain_fences[i] != VK_NULL_HANDLE)
vkDestroyFence(wl->vk.context.device,
wl->vk.context.swapchain_fences[i], NULL);
}
if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT, NULL))
{
cached_device = wl->vk.context.device;
cached_instance = wl->vk.context.instance;
}
else
{
if (wl->vk.context.device)
vkDestroyDevice(wl->vk.context.device, NULL);
if (wl->vk.context.instance)
vkDestroyInstance(wl->vk.context.instance, NULL);
}
if (wl->fd >= 0) if (wl->fd >= 0)
close(wl->fd); close(wl->fd);
@ -311,8 +279,8 @@ static void gfx_ctx_wl_destroy_resources(gfx_ctx_wayland_data_t *wl)
wl->shell_surf = NULL; wl->shell_surf = NULL;
wl->surface = NULL; wl->surface = NULL;
wl->width = 0; wl->width = 0;
wl->height = 0; wl->height = 0;
} }
static void flush_wayland_fd(gfx_ctx_wayland_data_t *wl) static void flush_wayland_fd(gfx_ctx_wayland_data_t *wl)
@ -472,10 +440,41 @@ static void gfx_ctx_wl_get_video_size(void *data,
} \ } \
} while(0) } while(0)
static void vulkan_destroy_context(gfx_ctx_vulkan_data_t *vk) static void vulkan_destroy_context(gfx_ctx_vulkan_data_t *vk, bool destroy_surface)
{ {
if (vk->context.queue_lock) unsigned i;
slock_free(vk->context.queue_lock); if (vk->context.queue)
vkQueueWaitIdle(vk->context.queue);
if (vk->swapchain)
vk->fpDestroySwapchainKHR(vk->context.device,
vk->swapchain, NULL);
if (destroy_surface)
vk->fpDestroySurfaceKHR(vk->context.instance,
vk->vk_surface, NULL);
for (i = 0; i < VULKAN_MAX_SWAPCHAIN_IMAGES; i++)
{
if (vk->context.swapchain_semaphores[i] != VK_NULL_HANDLE)
vkDestroySemaphore(vk->context.device,
vk->context.swapchain_semaphores[i], NULL);
if (vk->context.swapchain_fences[i] != VK_NULL_HANDLE)
vkDestroyFence(vk->context.device,
vk->context.swapchain_fences[i], NULL);
}
if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT, NULL))
{
cached_device = vk->context.device;
cached_instance = vk->context.instance;
}
else
{
if (vk->context.device)
vkDestroyDevice(vk->context.device, NULL);
if (vk->context.instance)
vkDestroyInstance(vk->context.instance, NULL);
}
} }
static bool vulkan_init_context(gfx_ctx_vulkan_data_t *vk) static bool vulkan_init_context(gfx_ctx_vulkan_data_t *vk)
@ -860,7 +859,8 @@ static void gfx_ctx_wl_destroy(void *data)
{ {
case GFX_CTX_VULKAN_API: case GFX_CTX_VULKAN_API:
#ifdef HAVE_VULKAN #ifdef HAVE_VULKAN
vulkan_destroy_context(&wl->vk); if (wl->vk.context.queue_lock)
slock_free(wl->vk.context.queue_lock);
#endif #endif
break; break;
case GFX_CTX_NONE: case GFX_CTX_NONE: