1// Copyright 2021-2022 The Khronos Group Inc. 2// 3// SPDX-License-Identifier: CC-BY-4.0 4 5= VK_GOOGLE_surfaceless_query 6:toc: left 7:refpage: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/ 8:sectnums: 9 10This proposal regards layering OpenGL over Vulkan, and addresses a discrepancy 11where EGL is able to respond to certain queries before a surface is created, 12while Vulkan requires a surface for corresponding queries. 13 14== Problem Statement 15 16An application using EGL can query the list of supported ``EGLConfig``s, based on 17which it would create an `EGLSurface`. 18Additionally, based on the availability of extensions, it can provide a 19colorspace to `eglCreateWindowSurface` at the same time. 20 21In Vulkan, the format and colorspace information are retrievable from the 22`VkSurface` through 23link:{refpage}vkGetPhysicalDeviceSurfaceFormatsKHR.html[`vkGetPhysicalDeviceSurfaceFormatsKHR`] 24When layering OpenGL over Vulkan, there needs to be a way to query this 25information before the surface is created. 26 27Similarly, the OpenGL implementation layer needs to know: 28 29- The supported present modes by the platform to be able to correctly expose 30 the `EGL_KHR_mutable_render_buffer` extension, 31- Whether protected surfaces are supported to be able to correctly expose the 32 `EGL_EXT_protected_content` extension. 33 34On some implementations and platforms, the surface formats, colorspaces, 35present modes and support for protected content are identical for every 36surface, and such queries could in fact be answered before a surface is 37created. 38 39== Solution Space 40 41Currently, no cross-platform solution is known to exist to support layering 42OpenGL over Vulkan in this regard. 43 44=== Surfaceless Queries 45 46One solution is to modify the existing relevant queries to allow querying 47without a link:{refpage}VkSurface.html[`VkSurface`]. 48This works on platforms where this information is truly global, which is 49currently the case with Google's Android and SwiftShader. 50 51Pros: 52 53- Trivial to implement and use 54 55Cons: 56 57- Works only on some platforms, and cannot be implemented on all platforms. 58 59== Proposal 60 61In VK_GOOGLE_surfaceless_query, the first solution is adopted primarily to 62accelerate producing working systems where OpenGL is layered on Vulkan. 63 64With this extension, the `surface` parameter can be `VK_NULL_HANDLE` in the 65following: 66 67- link:{refpage}vkGetPhysicalDeviceSurfaceFormatsKHR.html[`vkGetPhysicalDeviceSurfaceFormatsKHR`] 68- link:{refpage}vkGetPhysicalDeviceSurfacePresentModesKHR.html[`vkGetPhysicalDeviceSurfacePresentModesKHR`] 69- `pSurfaceInfo->surface` passed to 70 link:{refpage}vkGetPhysicalDeviceSurfaceCapabilities2KHR.html[`vkGetPhysicalDeviceSurfaceCapabilities2KHR`] 71 if 72 link:{refpage}VkSurfaceProtectedCapabilitiesKHR.html[`VkSurfaceProtectedCapabilitiesKHR`] 73 is chained to `pSurfaceCapabilities`. 74 In this case, only the protected information is populated, while 75 link:{refpage}VkSurfaceCapabilities2KHR.html[`VkSurfaceCapabilities2KHR`]`::surfaceCapabilities` 76 and any other chained structs will have undefined values. 77 78In all the above situations, calling the function with any valid `surface` 79parameter will produce identical results to calling it with `VK_NULL_HANDLE`. 80