diff options
| author | Mike Gorchak <mgorchak@blackberry.com> | 2023-08-24 15:11:56 -0400 |
|---|---|---|
| committer | Charles Giessen <46324611+charles-lunarg@users.noreply.github.com> | 2023-08-24 17:42:40 -0600 |
| commit | 0c08a569d0a4d0990494490ced6a9bb35dfd5d88 (patch) | |
| tree | 79236469a8cd77377a74dd1518f411a67383619c | |
| parent | b441f434a036d6fe463ba944c8d7e0a9cd30faa6 (diff) | |
| download | usermoji-0c08a569d0a4d0990494490ced6a9bb35dfd5d88.tar.xz | |
Add public support for QNX to vulkaninfo
Sample output:
==========
VULKANINFO
==========
Vulkan Instance Version: 1.3.261
Instance Extensions: count = 16
===============================
VK_EXT_debug_report : extension revision 10
VK_EXT_debug_utils : extension revision 2
VK_EXT_direct_mode_display : extension revision 1
VK_EXT_display_surface_counter : extension revision 1
VK_KHR_device_group_creation : extension revision 1
VK_KHR_display : extension revision 23
VK_KHR_external_fence_capabilities : extension revision 1
VK_KHR_external_memory_capabilities : extension revision 1
VK_KHR_external_semaphore_capabilities : extension revision 1
VK_KHR_get_display_properties2 : extension revision 1
VK_KHR_get_physical_device_properties2 : extension revision 2
VK_KHR_get_surface_capabilities2 : extension revision 1
VK_KHR_portability_enumeration : extension revision 1
VK_KHR_surface : extension revision 25
VK_LUNARG_direct_driver_loading : extension revision 1
VK_QNX_screen_surface : extension revision 1
Layers: count = 1
=================
VK_LAYER_KHRONOS_validation (Khronos Validation Layer) Vulkan version 1.2.190, layer version 1:
Layer Extensions: count = 3
VK_EXT_debug_report : extension revision 9
VK_EXT_debug_utils : extension revision 1
VK_EXT_validation_features : extension revision 2
Devices: count = 1
GPU id = 0 (Samsung Xclipse 930A)
Layer-Device Extensions: count = 3
VK_EXT_debug_marker : extension revision 4
VK_EXT_tooling_info : extension revision 1
VK_EXT_validation_cache : extension revision 1
Presentable Surfaces:
=====================
GPU id : 0 (Samsung Xclipse 930A):
Surface type = VK_QNX_screen_surface
Formats: count = 8
SurfaceFormat[0]:
format = FORMAT_B8G8R8A8_UNORM
colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
SurfaceFormat[1]:
format = FORMAT_B8G8R8A8_SRGB
colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
SurfaceFormat[2]:
format = FORMAT_R8G8B8A8_UNORM
colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
SurfaceFormat[3]:
format = FORMAT_R8G8B8A8_SRGB
colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
SurfaceFormat[4]:
format = FORMAT_A2R10G10B10_UNORM_PACK32
colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
SurfaceFormat[5]:
format = FORMAT_A2B10G10R10_UNORM_PACK32
colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
SurfaceFormat[6]:
format = FORMAT_A1R5G5B5_UNORM_PACK16
colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
SurfaceFormat[7]:
format = FORMAT_R5G6B5_UNORM_PACK16
colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
Present Modes: count = 4
PRESENT_MODE_IMMEDIATE_KHR
PRESENT_MODE_MAILBOX_KHR
PRESENT_MODE_FIFO_KHR
PRESENT_MODE_FIFO_RELAXED_KHR
...
...
...
| -rw-r--r-- | vulkaninfo/vulkaninfo.h | 78 |
1 files changed, 72 insertions, 6 deletions
diff --git a/vulkaninfo/vulkaninfo.h b/vulkaninfo/vulkaninfo.h index 5bc13056..9a2f642e 100644 --- a/vulkaninfo/vulkaninfo.h +++ b/vulkaninfo/vulkaninfo.h @@ -67,7 +67,7 @@ #endif #endif // _WIN32 -#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) #include <dlfcn.h> #endif @@ -252,7 +252,7 @@ auto GetVector(const char *func_name, F &&f, Ts &&...ts) -> std::vector<T> { // ----------- Instance Setup ------- // struct VkDll { VkResult Initialize() { -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) library = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); if (!library) library = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL); #elif defined(_WIN32) @@ -264,7 +264,7 @@ struct VkDll { return VK_SUCCESS; } void Close() { -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) dlclose(library); #elif defined(_WIN32) FreeLibrary(library); @@ -356,6 +356,11 @@ struct VkDll { #ifdef VK_USE_PLATFORM_METAL_EXT PFN_vkCreateMetalSurfaceEXT fp_vkCreateMetalSurfaceEXT = APPLE_FP(vkCreateMetalSurfaceEXT); #endif // VK_USE_PLATFORM_METAL_EXT +#ifdef VK_USE_PLATFORM_SCREEN_QNX + PFN_vkCreateScreenSurfaceQNX fp_vkCreateScreenSurfaceQNX = APPLE_FP(vkCreateScreenSurfaceQNX); + PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX fp_vkGetPhysicalDeviceScreenPresentationSupportQNX = + APPLE_FP(vkGetPhysicalDeviceScreenPresentationSupportQNX); +#endif // VK_USE_PLATFORM_SCREEN_QNX void InitializeDispatchPointers() { Load(fp_vkCreateInstance, "vkCreateInstance"); Load(fp_vkDestroyInstance, "vkDestroyInstance"); @@ -420,18 +425,21 @@ struct VkDll { #ifdef VK_USE_PLATFORM_METAL_EXT Load(fp_vkCreateMetalSurfaceEXT, "vkCreateMetalSurfaceEXT"); #endif // VK_USE_PLATFORM_METAL_EXT +#ifdef VK_USE_PLATFORM_SCREEN_QNX + Load(fp_vkCreateScreenSurfaceQNX, "vkCreateScreenSurfaceQNX"); +#endif // VK_USE_PLATFORM_SCREEN_QNX } private: template <typename T> void Load(T &func_dest, const char *func_name) { -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) func_dest = reinterpret_cast<T>(dlsym(library, func_name)); #elif defined(_WIN32) func_dest = reinterpret_cast<T>(GetProcAddress(library, func_name)); #endif } -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) void *library; #elif defined(_WIN32) HMODULE library; @@ -622,6 +630,10 @@ struct AppInstance { #ifdef VK_USE_PLATFORM_ANDROID_KHR // TODO ANativeWindow *window; #endif +#ifdef VK_USE_PLATFORM_SCREEN_QNX + struct _screen_context* context; + struct _screen_window* window; +#endif AppInstance() { VkResult dllErr = dll.Initialize(); if (dllErr != VK_SUCCESS) { @@ -825,7 +837,8 @@ struct AppInstance { #if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_WIN32_KHR) || \ defined(VK_USE_PLATFORM_MACOS_MVK) || defined(VK_USE_PLATFORM_METAL_EXT) || defined(VK_USE_PLATFORM_WAYLAND_KHR) || \ - defined(VK_USE_PLATFORM_DIRECTFB_EXT) || defined(VK_USE_PLATFORM_GGP) + defined(VK_USE_PLATFORM_DIRECTFB_EXT) || defined(VK_USE_PLATFORM_GGP) || defined(VK_USE_PLATFORM_SCREEN_QNX) + #define VULKANINFO_WSI_ENABLED #endif @@ -1190,6 +1203,47 @@ static VkSurfaceKHR AppCreateGgpSurface(AppInstance &inst) { static void AppDestroyGgpWindow(AppInstance &inst) {} #endif //----------------------------------------------------------- +//----------------------QNX SCREEN--------------------------- +#ifdef VK_USE_PLATFORM_SCREEN_QNX +static void AppCreateScreenWindow(AppInstance &inst) { + int usage = SCREEN_USAGE_VULKAN; + int rc; + + rc = screen_create_context(&inst.context, 0); + if (rc) { + THROW_ERR("Could not create a QNX Screen context.\nExiting..."); + } + rc = screen_create_window(&inst.window, inst.context); + if (rc) { + THROW_ERR("Could not create a QNX Screen window.\nExiting..."); + } + rc = screen_set_window_property_iv(inst.window, SCREEN_PROPERTY_USAGE, &usage); + if (rc) { + THROW_ERR("Could not set SCREEN_USAGE_VULKAN flag for QNX Screen window!\nExiting..."); + } +} + +static VkSurfaceKHR AppCreateScreenSurface(AppInstance &inst) { + VkScreenSurfaceCreateInfoQNX createInfo; + createInfo.sType = VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX; + createInfo.pNext = nullptr; + createInfo.flags = 0; + createInfo.context = inst.context; + createInfo.window = inst.window; + + VkSurfaceKHR surface; + VkResult err = inst.dll.fp_vkCreateScreenSurfaceQNX(inst.instance, &createInfo, nullptr, &surface); + if (err) THROW_VK_ERR("vkCreateScreenSurfaceQNX", err); + return surface; +} + +static void AppDestroyScreenWindow(AppInstance &inst) +{ + screen_destroy_window(inst.window); + screen_destroy_context(inst.context); +} +#endif // VK_USE_PLATFORM_SCREEN_QNX +//----------------------------------------------------------- // ------------ Setup Windows ------------- // void SetupWindowExtensions(AppInstance &inst) { @@ -1322,6 +1376,18 @@ void SetupWindowExtensions(AppInstance &inst) { inst.AddSurfaceExtension(surface_ext_ggp); } #endif +//--QNX_SCREEN-- +#ifdef VK_USE_PLATFORM_SCREEN_QNX + SurfaceExtension surface_ext_qnx_screen; + if (inst.CheckExtensionEnabled(VK_QNX_SCREEN_SURFACE_EXTENSION_NAME)) { + surface_ext_qnx_screen.name = VK_QNX_SCREEN_SURFACE_EXTENSION_NAME; + surface_ext_qnx_screen.create_window = AppCreateScreenWindow; + surface_ext_qnx_screen.create_surface = AppCreateScreenSurface; + surface_ext_qnx_screen.destroy_window = AppDestroyScreenWindow; + + inst.AddSurfaceExtension(surface_ext_qnx_screen); + } +#endif } // ---------- Surfaces -------------- // |
