From e9046dd06f6f4fe7116640b4ebafaa5b626957e1 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 6 Jul 2016 19:37:47 +0200 Subject: [PATCH] Begin implementing VK_KHR_display. --- gfx/common/vulkan_common.c | 61 +++++++++++++++++++++++++++++--------- gfx/common/vulkan_common.h | 9 +++++- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 9f1ad5ad03..db5e216a7c 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -1435,12 +1435,13 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, VkResult res; VkInstanceCreateInfo info = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO }; VkApplicationInfo app = { VK_STRUCTURE_TYPE_APPLICATION_INFO }; + + const char *instance_extensions[4]; + unsigned ext_count = 0; + #ifdef VULKAN_DEBUG - const char *instance_extensions[3]; - instance_extensions[2] = "VK_EXT_debug_report"; + instance_extensions[ext_count++] = "VK_EXT_debug_report"; static const char *instance_layers[] = { "VK_LAYER_LUNARG_standard_validation" }; -#else - const char *instance_extensions[2]; #endif bool use_instance_ext; @@ -1459,31 +1460,33 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, iface = NULL; } - instance_extensions[0] = "VK_KHR_surface"; + instance_extensions[ext_count++] = "VK_KHR_surface"; switch (type) { case VULKAN_WSI_WAYLAND: - instance_extensions[1] = "VK_KHR_wayland_surface"; + instance_extensions[ext_count++] = "VK_KHR_wayland_surface"; break; case VULKAN_WSI_ANDROID: - instance_extensions[1] = "VK_KHR_android_surface"; + instance_extensions[ext_count++] = "VK_KHR_android_surface"; break; case VULKAN_WSI_WIN32: - instance_extensions[1] = "VK_KHR_win32_surface"; + instance_extensions[ext_count++] = "VK_KHR_win32_surface"; break; case VULKAN_WSI_XLIB: - instance_extensions[1] = "VK_KHR_xlib_surface"; + instance_extensions[ext_count++] = "VK_KHR_xlib_surface"; break; case VULKAN_WSI_XCB: - instance_extensions[1] = "VK_KHR_xcb_surface"; + instance_extensions[ext_count++] = "VK_KHR_xcb_surface"; break; case VULKAN_WSI_MIR: - instance_extensions[1] = "VK_KHR_mir_surface"; + instance_extensions[ext_count++] = "VK_KHR_mir_surface"; + break; + case VULKAN_WSI_DISPLAY: + instance_extensions[ext_count++] = "VK_KHR_display"; break; case VULKAN_WSI_NONE: default: - instance_extensions[1] = NULL; break; } @@ -1521,7 +1524,7 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, return false; } - use_instance_ext = vulkan_find_instance_extensions(instance_extensions, ARRAY_SIZE(instance_extensions)); + use_instance_ext = vulkan_find_instance_extensions(instance_extensions, ext_count); app.pApplicationName = "RetroArch"; app.applicationVersion = 0; @@ -1530,7 +1533,7 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, app.apiVersion = VK_MAKE_VERSION(1, 0, 18); info.pApplicationInfo = &app; - info.enabledExtensionCount = use_instance_ext ? ARRAY_SIZE(instance_extensions) : 0; + info.enabledExtensionCount = use_instance_ext ? ext_count : 0; info.ppEnabledExtensionNames = use_instance_ext ? instance_extensions : NULL; #ifdef VULKAN_DEBUG info.enabledLayerCount = ARRAY_SIZE(instance_layers); @@ -1608,6 +1611,28 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, return true; } +static bool vulkan_create_display_surface(gfx_ctx_vulkan_data_t *vk, + unsigned *width, unsigned *height, + const struct vulkan_display_surface_info *info) +{ + VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, + vkGetPhysicalDeviceDisplayPropertiesKHR); + VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, + vkGetPhysicalDeviceDisplayPlanePropertiesKHR); + VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, + vkGetDisplayPlaneSupportedDisplaysKHR); + VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, + vkGetDisplayModePropertiesKHR); + VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, + vkCreateDisplayModeKHR); + VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, + vkGetDisplayPlaneCapabilitiesKHR); + VULKAN_SYMBOL_WRAPPER_LOAD_INSTANCE_EXTENSION_SYMBOL(vk->context.instance, + vkCreateDisplayPlaneSurfaceKHR); + + return false; +} + bool vulkan_surface_create(gfx_ctx_vulkan_data_t *vk, enum vulkan_wsi_type type, void *display, void *surface, @@ -1751,6 +1776,14 @@ bool vulkan_surface_create(gfx_ctx_vulkan_data_t *vk, } #endif break; + case VULKAN_WSI_DISPLAY: + { + if (!vulkan_create_display_surface(vk, + &width, &height, + (const struct vulkan_display_surface_info*)display)) + return false; + } + break; case VULKAN_WSI_NONE: default: return false; diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 7a87d6c032..7e69ca3e7c 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -82,7 +82,8 @@ enum vulkan_wsi_type VULKAN_WSI_ANDROID, VULKAN_WSI_WIN32, VULKAN_WSI_XCB, - VULKAN_WSI_XLIB + VULKAN_WSI_XLIB, + VULKAN_WSI_DISPLAY }; typedef struct vulkan_context @@ -125,6 +126,12 @@ typedef struct gfx_ctx_vulkan_data bool need_new_swapchain; } gfx_ctx_vulkan_data_t; +struct vulkan_display_surface_info +{ + unsigned width; + unsigned height; +}; + struct vk_color { float r, g, b, a;