mirror of
https://gitlab.freedesktop.org/mesa/vulkan-wsi-layer.git
synced 2026-05-08 03:18:05 +02:00
Check for unsupported surfaces in the layer
Change-Id: I64eca7bf0f5f095c4dbc916c84377ae17350b3ec Signed-off-by: Angeliki Agathi Tsintzira <angelikiagathi.tsintzira@arm.com>
This commit is contained in:
parent
8b18c35cb3
commit
1f37310208
8 changed files with 151 additions and 14 deletions
|
|
@ -50,6 +50,12 @@ The ICDs installed in the system are required to support the following extension
|
|||
* VK_KHR_external_fence_fd
|
||||
* Any dependencies of the above extensions
|
||||
|
||||
### Vulkan Header Version
|
||||
|
||||
The Vulkan WSI Layer has been validated against Vulkan header version 1.4.299.
|
||||
|
||||
If you are using a Vulkan header version newer than this, a warning will appear during compilation.
|
||||
|
||||
### Building the Vulkan® loader
|
||||
|
||||
This step is not necessary if your system already has a loader and associated
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
"name": "VK_LAYER_window_system_integration",
|
||||
"type": "GLOBAL",
|
||||
"library_path": "./libVkLayer_window_system_integration.so",
|
||||
"api_version": "1.3.216",
|
||||
"api_version": "1.4.299",
|
||||
"implementation_version": "1",
|
||||
"description": "Window system integration layer",
|
||||
"functions": {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2016-2024 Arm Limited.
|
||||
* Copyright (c) 2016-2025 Arm Limited.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
|
@ -40,6 +40,7 @@
|
|||
#include "util/log.hpp"
|
||||
#include "util/macros.hpp"
|
||||
#include "util/helpers.hpp"
|
||||
#include "wsi/unsupported_surfaces.hpp"
|
||||
|
||||
#if VULKAN_WSI_LAYER_EXPERIMENTAL
|
||||
#include "wsi_layer_experimental.hpp"
|
||||
|
|
@ -157,6 +158,18 @@ VKAPI_ATTR VkResult create_instance(const VkInstanceCreateInfo *pCreateInfo, con
|
|||
modified_info.enabledExtensionCount = modified_enabled_extensions.size();
|
||||
}
|
||||
|
||||
bool maintainance1_support = true;
|
||||
/* Loop through unsupported extensions and check if they exist in enabled extensions */
|
||||
for (const auto &unsupported_surface_ext : wsi::unsupported_surfaces_ext_array)
|
||||
{
|
||||
if (extensions.contains(unsupported_surface_ext))
|
||||
{
|
||||
maintainance1_support = false;
|
||||
WSI_LOG_ERROR(
|
||||
"Warning: Swapchain maintenance feature is unsupported for the current surface and ICD configuration.\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Advance the link info for the next element on the chain. */
|
||||
layer_link_info->u.pLayerInfo = layer_link_info->u.pLayerInfo->pNext;
|
||||
|
||||
|
|
@ -191,6 +204,8 @@ VKAPI_ATTR VkResult create_instance(const VkInstanceCreateInfo *pCreateInfo, con
|
|||
TRY_LOG_CALL(instance_private_data::associate(*pInstance, std::move(*table), loader_callback,
|
||||
layer_platforms_to_enable, api_version, instance_allocator));
|
||||
|
||||
/* Set the swapchain maintenance flag to true or false based on the enabled extensions checked above*/
|
||||
instance_private_data::get(*pInstance).set_maintainance1_support(maintainance1_support);
|
||||
/*
|
||||
* Store the enabled instance extensions in order to return nullptr in
|
||||
* vkGetInstanceProcAddr for functions of disabled extensions.
|
||||
|
|
@ -469,7 +484,15 @@ wsi_layer_vkGetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice,
|
|||
VkPhysicalDeviceFeatures2 *pFeatures) VWL_API_POST
|
||||
{
|
||||
auto &instance = layer::instance_private_data::get(physicalDevice);
|
||||
|
||||
#if VULKAN_WSI_LAYER_EXPERIMENTAL
|
||||
auto *physical_device_swapchain_maintenance1_features =
|
||||
util::find_extension<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT>(
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, pFeatures->pNext);
|
||||
if (physical_device_swapchain_maintenance1_features != nullptr)
|
||||
{
|
||||
physical_device_swapchain_maintenance1_features->swapchainMaintenance1 = false;
|
||||
}
|
||||
#endif
|
||||
instance.disp.GetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
|
||||
|
||||
#if WSI_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN
|
||||
|
|
@ -491,13 +514,7 @@ wsi_layer_vkGetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice,
|
|||
}
|
||||
|
||||
#if VULKAN_WSI_LAYER_EXPERIMENTAL
|
||||
auto *physical_device_swapchain_maintenance1_features =
|
||||
util::find_extension<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT>(
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, pFeatures->pNext);
|
||||
if (physical_device_swapchain_maintenance1_features != nullptr)
|
||||
{
|
||||
physical_device_swapchain_maintenance1_features->swapchainMaintenance1 = true;
|
||||
}
|
||||
wsi::set_swapchain_maintenance1_state(physicalDevice, physical_device_swapchain_maintenance1_features);
|
||||
|
||||
auto *present_timing_features = util::find_extension<VkPhysicalDevicePresentTimingFeaturesEXT>(
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT, pFeatures->pNext);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2024 Arm Limited.
|
||||
* Copyright (c) 2018-2025 Arm Limited.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
|
@ -398,6 +398,16 @@ bool instance_private_data::is_instance_extension_enabled(const char *extension_
|
|||
return enabled_extensions.contains(extension_name);
|
||||
}
|
||||
|
||||
void instance_private_data::set_maintainance1_support(bool enabled_unsupport_ext)
|
||||
{
|
||||
enabled_unsupported_swapchain_maintenance1_extensions = enabled_unsupport_ext;
|
||||
}
|
||||
|
||||
bool instance_private_data::get_maintainance1_support()
|
||||
{
|
||||
return enabled_unsupported_swapchain_maintenance1_extensions;
|
||||
}
|
||||
|
||||
device_private_data::device_private_data(instance_private_data &inst_data, VkPhysicalDevice phys_dev, VkDevice dev,
|
||||
device_dispatch_table table, PFN_vkSetDeviceLoaderData set_loader_data,
|
||||
const util::allocator &alloc)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2024 Arm Limited.
|
||||
* Copyright (c) 2018-2025 Arm Limited.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
|
@ -637,6 +637,22 @@ public:
|
|||
const instance_dispatch_table disp;
|
||||
const uint32_t api_version;
|
||||
|
||||
/**
|
||||
* @brief Set if swapchain maintainance1 support is enabled.
|
||||
*
|
||||
* @param enabled_unsupport_ext True if it is enabled, false otherwise.
|
||||
*
|
||||
*/
|
||||
void set_maintainance1_support(bool enabled_unsupport_ext);
|
||||
|
||||
/**
|
||||
* @brief Check if swapchain maintainance1 support is enabled.
|
||||
*
|
||||
* @return true if it is enabled, false otherwise.
|
||||
*
|
||||
*/
|
||||
bool get_maintainance1_support();
|
||||
|
||||
private:
|
||||
/* Allow util::allocator to access the private constructor */
|
||||
friend util::allocator;
|
||||
|
|
@ -687,6 +703,11 @@ private:
|
|||
* @brief List with the names of the enabled instance extensions.
|
||||
*/
|
||||
util::extension_list enabled_extensions;
|
||||
|
||||
/**
|
||||
* @brief True if unsupported extensions are enabled.
|
||||
*/
|
||||
bool enabled_unsupported_swapchain_maintenance1_extensions;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
49
wsi/unsupported_surfaces.hpp
Normal file
49
wsi/unsupported_surfaces.hpp
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Copyright (c) 2024-2025 Arm Limited.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* 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 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.
|
||||
*/
|
||||
|
||||
#include <vulkan/vulkan_core.h>
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <array>
|
||||
/* Define the patch version directly as macros */
|
||||
#define WSI_LAYER_VK_PATCH 299
|
||||
|
||||
/* Convert macros to string */
|
||||
#define STRINGIFY(x) #x
|
||||
#define TOSTRING(x) STRINGIFY(x)
|
||||
|
||||
#if VK_HEADER_VERSION > WSI_LAYER_VK_PATCH
|
||||
#pragma message("The Vulkan header version is newer than the currently supported version.")
|
||||
#pragma message("Current Vulkan header version: " TOSTRING(VK_HEADER_VERSION))
|
||||
#pragma message("Supported Vulkan API version: " TOSTRING(WSI_LAYER_VK_PATCH))
|
||||
#endif
|
||||
|
||||
namespace wsi
|
||||
{
|
||||
/* A list of platform-specific unsupported surface extensions
|
||||
Not using the extension macros and symbols due to missing definitions for native platform symbols. */
|
||||
static constexpr std::array unsupported_surfaces_ext_array = { "VK_KHR_win32_surface", "VK_KHR_xlib_surface",
|
||||
"VK_KHR_xcb_surface", "VK_EXT_metal_surface",
|
||||
"VK_KHR_android_surface" };
|
||||
|
||||
} // namespace wsi
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2019-2024 Arm Limited.
|
||||
* Copyright (c) 2019-2025 Arm Limited.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
|
@ -281,4 +281,25 @@ PFN_vkVoidFunction get_proc_addr(const char *name, const layer::instance_private
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
void set_swapchain_maintenance1_state(VkPhysicalDevice physicalDevice,
|
||||
VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *swapchain_maintenance1_features)
|
||||
{
|
||||
if (swapchain_maintenance1_features != nullptr)
|
||||
{
|
||||
if (swapchain_maintenance1_features->swapchainMaintenance1)
|
||||
{
|
||||
auto &instance = layer::instance_private_data::get(physicalDevice);
|
||||
if (instance.is_instance_extension_enabled(VK_KHR_DISPLAY_EXTENSION_NAME))
|
||||
{
|
||||
swapchain_maintenance1_features->swapchainMaintenance1 = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
swapchain_maintenance1_features->swapchainMaintenance1 =
|
||||
layer::instance_private_data::get(physicalDevice).get_maintainance1_support();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace wsi
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2019, 2021, 2023 Arm Limited.
|
||||
* Copyright (c) 2019, 2021, 2023-2025 Arm Limited.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
|
|
@ -124,4 +124,17 @@ VkResult add_instance_extensions_required_by_layer(const util::wsi_platform_set
|
|||
*/
|
||||
PFN_vkVoidFunction get_proc_addr(const char *name, const layer::instance_private_data &instance_data);
|
||||
|
||||
/**
|
||||
* @brief Set swapchain maintenance1 features state, true or false.
|
||||
*
|
||||
* Sets the state of the swapchain maintenance1 extensions
|
||||
* according to the supported enabled extensions.
|
||||
*
|
||||
* @param physical_device Vulkan physical_device.
|
||||
* @param swapchain_maintenance_features address of Vulkan swapchain maintenance capabilities struct.
|
||||
*
|
||||
*/
|
||||
void set_swapchain_maintenance1_state(
|
||||
VkPhysicalDevice physicalDevice, VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT *swapchain_maintenance1_features);
|
||||
|
||||
} // namespace wsi
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue