Skip to content

Commit

Permalink
Merge branch 'KhronosGroup:main' into document_terminator_createDevic…
Browse files Browse the repository at this point in the history
…e_not_modify_device
  • Loading branch information
charles-lunarg authored Sep 11, 2023
2 parents 04860c9 + 1c827fd commit feb6fe6
Show file tree
Hide file tree
Showing 16 changed files with 466 additions and 123 deletions.
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
# ~~~
cmake_minimum_required(VERSION 3.17.2)

project(VULKAN_LOADER VERSION 1.3.261)
project(VULKAN_LOADER VERSION 1.3.264)

add_subdirectory(scripts)

Expand Down Expand Up @@ -99,7 +99,7 @@ add_library(platform_wsi INTERFACE)
if(WIN32)
target_compile_definitions(platform_wsi INTERFACE VK_USE_PLATFORM_WIN32_KHR)
elseif(ANDROID)
target_compile_definitions(platform_wsi INTERFACE VK_USE_PLATFORM_ANDROID_KHR)
message(FATAL_ERROR "Android build not supported!")
elseif(APPLE)
target_compile_definitions(platform_wsi INTERFACE VK_USE_PLATFORM_MACOS_MVK VK_USE_PLATFORM_METAL_EXT)
elseif(UNIX AND NOT APPLE) # i.e.: Linux
Expand Down
4 changes: 3 additions & 1 deletion build-qnx/common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ NAME=vulkan

SRCS = cJSON.c debug_utils.c dev_ext_trampoline.c loader.c \
phys_dev_ext.c trampoline.c unknown_ext_chain.c wsi.c \
extension_manual.c unknown_function_handling.c
extension_manual.c unknown_function_handling.c settings.c \
log.c allocation.c loader_environment.c gpa_helper.c \
terminator.c

LDFLAGS += -Wl,--unresolved-symbols=report-all -Wl,--no-undefined -Wl,-fPIC

Expand Down
5 changes: 1 addition & 4 deletions loader/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -324,10 +324,7 @@ else()
set_target_properties(vulkan
PROPERTIES SOVERSION "1"
VERSION ${VULKAN_LOADER_VERSION})
target_link_libraries(vulkan PRIVATE ${CMAKE_DL_LIBS} m)
if (NOT ANDROID)
target_link_libraries(vulkan PRIVATE Threads::Threads)
endif()
target_link_libraries(vulkan PRIVATE ${CMAKE_DL_LIBS} m Threads::Threads)

if (LOADER_ENABLE_ADDRESS_SANITIZER)
target_compile_options(vulkan PUBLIC -fsanitize=address)
Expand Down
64 changes: 32 additions & 32 deletions loader/generated/vk_loader_extensions.c
Original file line number Diff line number Diff line change
Expand Up @@ -1429,38 +1429,38 @@ void init_extension_device_proc_terminator_dispatch(struct loader_device *dev) {
struct loader_device_terminator_dispatch* dispatch = &dev->loader_dispatch.extension_terminator_dispatch;
PFN_vkGetDeviceProcAddr gpda = (PFN_vkGetDeviceProcAddr)dev->phys_dev_term->this_icd_term->dispatch.GetDeviceProcAddr;
// ---- VK_KHR_swapchain extension commands
if (dev->extensions.khr_swapchain_enabled)
if (dev->driver_extensions.khr_swapchain_enabled)
dispatch->CreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)gpda(dev->icd_device, "vkCreateSwapchainKHR");
if (dev->extensions.khr_swapchain_enabled)
if (dev->driver_extensions.khr_swapchain_enabled)
dispatch->GetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR)gpda(dev->icd_device, "vkGetDeviceGroupSurfacePresentModesKHR");
// ---- VK_KHR_display_swapchain extension commands
if (dev->extensions.khr_display_swapchain_enabled)
if (dev->driver_extensions.khr_display_swapchain_enabled)
dispatch->CreateSharedSwapchainsKHR = (PFN_vkCreateSharedSwapchainsKHR)gpda(dev->icd_device, "vkCreateSharedSwapchainsKHR");
// ---- VK_EXT_debug_marker extension commands
if (dev->extensions.ext_debug_marker_enabled)
if (dev->driver_extensions.ext_debug_marker_enabled)
dispatch->DebugMarkerSetObjectTagEXT = (PFN_vkDebugMarkerSetObjectTagEXT)gpda(dev->icd_device, "vkDebugMarkerSetObjectTagEXT");
if (dev->extensions.ext_debug_marker_enabled)
if (dev->driver_extensions.ext_debug_marker_enabled)
dispatch->DebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)gpda(dev->icd_device, "vkDebugMarkerSetObjectNameEXT");
// ---- VK_EXT_debug_utils extension commands
if (dev->extensions.ext_debug_utils_enabled)
if (dev->driver_extensions.ext_debug_utils_enabled)
dispatch->SetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)gpda(dev->icd_device, "vkSetDebugUtilsObjectNameEXT");
if (dev->extensions.ext_debug_utils_enabled)
if (dev->driver_extensions.ext_debug_utils_enabled)
dispatch->SetDebugUtilsObjectTagEXT = (PFN_vkSetDebugUtilsObjectTagEXT)gpda(dev->icd_device, "vkSetDebugUtilsObjectTagEXT");
if (dev->extensions.ext_debug_utils_enabled)
if (dev->driver_extensions.ext_debug_utils_enabled)
dispatch->QueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT)gpda(dev->icd_device, "vkQueueBeginDebugUtilsLabelEXT");
if (dev->extensions.ext_debug_utils_enabled)
if (dev->driver_extensions.ext_debug_utils_enabled)
dispatch->QueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)gpda(dev->icd_device, "vkQueueEndDebugUtilsLabelEXT");
if (dev->extensions.ext_debug_utils_enabled)
if (dev->driver_extensions.ext_debug_utils_enabled)
dispatch->QueueInsertDebugUtilsLabelEXT = (PFN_vkQueueInsertDebugUtilsLabelEXT)gpda(dev->icd_device, "vkQueueInsertDebugUtilsLabelEXT");
if (dev->extensions.ext_debug_utils_enabled)
if (dev->driver_extensions.ext_debug_utils_enabled)
dispatch->CmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)gpda(dev->icd_device, "vkCmdBeginDebugUtilsLabelEXT");
if (dev->extensions.ext_debug_utils_enabled)
if (dev->driver_extensions.ext_debug_utils_enabled)
dispatch->CmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)gpda(dev->icd_device, "vkCmdEndDebugUtilsLabelEXT");
if (dev->extensions.ext_debug_utils_enabled)
if (dev->driver_extensions.ext_debug_utils_enabled)
dispatch->CmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)gpda(dev->icd_device, "vkCmdInsertDebugUtilsLabelEXT");
#if defined(VK_USE_PLATFORM_WIN32_KHR)
// ---- VK_EXT_full_screen_exclusive extension commands
if (dev->extensions.ext_full_screen_exclusive_enabled && dev->extensions.khr_device_group_enabled)
if (dev->driver_extensions.ext_full_screen_exclusive_enabled && dev->driver_extensions.khr_device_group_enabled)
dispatch->GetDeviceGroupSurfacePresentModes2EXT = (PFN_vkGetDeviceGroupSurfacePresentModes2EXT)gpda(dev->icd_device, "vkGetDeviceGroupSurfacePresentModes2EXT");
#endif // VK_USE_PLATFORM_WIN32_KHR
}
Expand Down Expand Up @@ -2439,8 +2439,8 @@ VKAPI_ATTR void* VKAPI_CALL loader_lookup_device_dispatch_table(const VkLayerDis
if (!strcmp(name, "GetImageSubresourceLayout2KHR")) return (void *)table->GetImageSubresourceLayout2KHR;

// ---- VK_EXT_debug_marker extension commands
if (!strcmp(name, "DebugMarkerSetObjectTagEXT")) return dev->extensions.ext_debug_marker_enabled ? (void *)DebugMarkerSetObjectTagEXT : NULL;
if (!strcmp(name, "DebugMarkerSetObjectNameEXT")) return dev->extensions.ext_debug_marker_enabled ? (void *)DebugMarkerSetObjectNameEXT : NULL;
if (!strcmp(name, "DebugMarkerSetObjectTagEXT")) return dev->layer_extensions.ext_debug_marker_enabled ? (void *)DebugMarkerSetObjectTagEXT : NULL;
if (!strcmp(name, "DebugMarkerSetObjectNameEXT")) return dev->layer_extensions.ext_debug_marker_enabled ? (void *)DebugMarkerSetObjectNameEXT : NULL;
if (!strcmp(name, "CmdDebugMarkerBeginEXT")) return (void *)table->CmdDebugMarkerBeginEXT;
if (!strcmp(name, "CmdDebugMarkerEndEXT")) return (void *)table->CmdDebugMarkerEndEXT;
if (!strcmp(name, "CmdDebugMarkerInsertEXT")) return (void *)table->CmdDebugMarkerInsertEXT;
Expand Down Expand Up @@ -2502,8 +2502,8 @@ VKAPI_ATTR void* VKAPI_CALL loader_lookup_device_dispatch_table(const VkLayerDis
if (!strcmp(name, "SetHdrMetadataEXT")) return (void *)table->SetHdrMetadataEXT;

// ---- VK_EXT_debug_utils extension commands
if (!strcmp(name, "SetDebugUtilsObjectNameEXT")) return dev->extensions.ext_debug_utils_enabled ? (void *)SetDebugUtilsObjectNameEXT : NULL;
if (!strcmp(name, "SetDebugUtilsObjectTagEXT")) return dev->extensions.ext_debug_utils_enabled ? (void *)SetDebugUtilsObjectTagEXT : NULL;
if (!strcmp(name, "SetDebugUtilsObjectNameEXT")) return dev->layer_extensions.ext_debug_utils_enabled ? (void *)SetDebugUtilsObjectNameEXT : NULL;
if (!strcmp(name, "SetDebugUtilsObjectTagEXT")) return dev->layer_extensions.ext_debug_utils_enabled ? (void *)SetDebugUtilsObjectTagEXT : NULL;
if (!strcmp(name, "QueueBeginDebugUtilsLabelEXT")) return (void *)table->QueueBeginDebugUtilsLabelEXT;
if (!strcmp(name, "QueueEndDebugUtilsLabelEXT")) return (void *)table->QueueEndDebugUtilsLabelEXT;
if (!strcmp(name, "QueueInsertDebugUtilsLabelEXT")) return (void *)table->QueueInsertDebugUtilsLabelEXT;
Expand Down Expand Up @@ -11385,77 +11385,77 @@ PFN_vkVoidFunction get_extension_device_proc_terminator(struct loader_device *de
// ---- VK_KHR_swapchain extension commands
if (!strcmp(name, "CreateSwapchainKHR")) {
*found_name = true;
return dev->extensions.khr_swapchain_enabled ?
return dev->driver_extensions.khr_swapchain_enabled ?
(PFN_vkVoidFunction)terminator_CreateSwapchainKHR : NULL;
}
if (!strcmp(name, "GetDeviceGroupSurfacePresentModesKHR")) {
*found_name = true;
return dev->extensions.khr_swapchain_enabled ?
return dev->driver_extensions.khr_swapchain_enabled ?
(PFN_vkVoidFunction)terminator_GetDeviceGroupSurfacePresentModesKHR : NULL;
}
// ---- VK_KHR_display_swapchain extension commands
if (!strcmp(name, "CreateSharedSwapchainsKHR")) {
*found_name = true;
return dev->extensions.khr_display_swapchain_enabled ?
return dev->driver_extensions.khr_display_swapchain_enabled ?
(PFN_vkVoidFunction)terminator_CreateSharedSwapchainsKHR : NULL;
}
// ---- VK_EXT_debug_marker extension commands
if (!strcmp(name, "DebugMarkerSetObjectTagEXT")) {
*found_name = true;
return dev->extensions.ext_debug_marker_enabled ?
return dev->driver_extensions.ext_debug_marker_enabled ?
(PFN_vkVoidFunction)terminator_DebugMarkerSetObjectTagEXT : NULL;
}
if (!strcmp(name, "DebugMarkerSetObjectNameEXT")) {
*found_name = true;
return dev->extensions.ext_debug_marker_enabled ?
return dev->driver_extensions.ext_debug_marker_enabled ?
(PFN_vkVoidFunction)terminator_DebugMarkerSetObjectNameEXT : NULL;
}
// ---- VK_EXT_debug_utils extension commands
if (!strcmp(name, "SetDebugUtilsObjectNameEXT")) {
*found_name = true;
return dev->extensions.ext_debug_utils_enabled ?
return dev->driver_extensions.ext_debug_utils_enabled ?
(PFN_vkVoidFunction)terminator_SetDebugUtilsObjectNameEXT : NULL;
}
if (!strcmp(name, "SetDebugUtilsObjectTagEXT")) {
*found_name = true;
return dev->extensions.ext_debug_utils_enabled ?
return dev->driver_extensions.ext_debug_utils_enabled ?
(PFN_vkVoidFunction)terminator_SetDebugUtilsObjectTagEXT : NULL;
}
if (!strcmp(name, "QueueBeginDebugUtilsLabelEXT")) {
*found_name = true;
return dev->extensions.ext_debug_utils_enabled ?
return dev->driver_extensions.ext_debug_utils_enabled ?
(PFN_vkVoidFunction)terminator_QueueBeginDebugUtilsLabelEXT : NULL;
}
if (!strcmp(name, "QueueEndDebugUtilsLabelEXT")) {
*found_name = true;
return dev->extensions.ext_debug_utils_enabled ?
return dev->driver_extensions.ext_debug_utils_enabled ?
(PFN_vkVoidFunction)terminator_QueueEndDebugUtilsLabelEXT : NULL;
}
if (!strcmp(name, "QueueInsertDebugUtilsLabelEXT")) {
*found_name = true;
return dev->extensions.ext_debug_utils_enabled ?
return dev->driver_extensions.ext_debug_utils_enabled ?
(PFN_vkVoidFunction)terminator_QueueInsertDebugUtilsLabelEXT : NULL;
}
if (!strcmp(name, "CmdBeginDebugUtilsLabelEXT")) {
*found_name = true;
return dev->extensions.ext_debug_utils_enabled ?
return dev->driver_extensions.ext_debug_utils_enabled ?
(PFN_vkVoidFunction)terminator_CmdBeginDebugUtilsLabelEXT : NULL;
}
if (!strcmp(name, "CmdEndDebugUtilsLabelEXT")) {
*found_name = true;
return dev->extensions.ext_debug_utils_enabled ?
return dev->driver_extensions.ext_debug_utils_enabled ?
(PFN_vkVoidFunction)terminator_CmdEndDebugUtilsLabelEXT : NULL;
}
if (!strcmp(name, "CmdInsertDebugUtilsLabelEXT")) {
*found_name = true;
return dev->extensions.ext_debug_utils_enabled ?
return dev->driver_extensions.ext_debug_utils_enabled ?
(PFN_vkVoidFunction)terminator_CmdInsertDebugUtilsLabelEXT : NULL;
}
#if defined(VK_USE_PLATFORM_WIN32_KHR)
// ---- VK_EXT_full_screen_exclusive extension commands
if (!strcmp(name, "GetDeviceGroupSurfacePresentModes2EXT")) {
*found_name = true;
return dev->extensions.ext_full_screen_exclusive_enabled && dev->extensions.khr_device_group_enabled ?
return dev->driver_extensions.ext_full_screen_exclusive_enabled && dev->driver_extensions.khr_device_group_enabled ?
(PFN_vkVoidFunction)terminator_GetDeviceGroupSurfacePresentModes2EXT : NULL;
}
#endif // VK_USE_PLATFORM_WIN32_KHR
Expand Down
50 changes: 40 additions & 10 deletions loader/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -2964,7 +2964,7 @@ VkResult read_data_files_in_search_paths(const struct loader_instance *inst, enu
char *xdg_config_home = loader_secure_getenv("XDG_CONFIG_HOME", inst);
char *xdg_config_dirs = loader_secure_getenv("XDG_CONFIG_DIRS", inst);

#if !defined(__Fuchsia__) && !defined(__QNXNTO__)
#if !defined(__Fuchsia__) && !defined(__QNX__)
if (NULL == xdg_config_dirs || '\0' == xdg_config_dirs[0]) {
xdg_config_dirs = FALLBACK_CONFIG_DIRS;
}
Expand All @@ -2973,7 +2973,7 @@ VkResult read_data_files_in_search_paths(const struct loader_instance *inst, enu
char *xdg_data_home = loader_secure_getenv("XDG_DATA_HOME", inst);
char *xdg_data_dirs = loader_secure_getenv("XDG_DATA_DIRS", inst);

#if !defined(__Fuchsia__) && !defined(__QNXNTO__)
#if !defined(__Fuchsia__) && !defined(__QNX__)
if (NULL == xdg_data_dirs || '\0' == xdg_data_dirs[0]) {
xdg_data_dirs = FALLBACK_DATA_DIRS;
}
Expand Down Expand Up @@ -4235,6 +4235,33 @@ bool loader_get_layer_interface_version(PFN_vkNegotiateLoaderLayerInterfaceVersi
return true;
}

// Every extension that has a loader-defined trampoline needs to be marked as enabled or disabled so that we know whether or
// not to return that trampoline when vkGetDeviceProcAddr is called
void setup_logical_device_enabled_layer_extensions(const struct loader_instance *inst, struct loader_device *dev,
const struct loader_extension_list *icd_exts,
const VkDeviceCreateInfo *pCreateInfo) {
// Can only setup debug marker as debug utils is an instance extensions.
for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; ++i) {
if (!strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) {
// Check if its supported by the driver
for (uint32_t j = 0; j < icd_exts->count; ++j) {
if (!strcmp(icd_exts->list[j].extensionName, VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) {
dev->layer_extensions.ext_debug_marker_enabled = true;
}
}
// also check if any layers support it.
for (uint32_t j = 0; j < inst->app_activated_layer_list.count; j++) {
struct loader_layer_properties *layer = inst->app_activated_layer_list.list[j];
for (uint32_t k = 0; k < layer->device_extension_list.count; k++) {
if (!strcmp(layer->device_extension_list.list[k].props.extensionName, VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) {
dev->layer_extensions.ext_debug_marker_enabled = true;
}
}
}
}
}
}

VKAPI_ATTR VkResult VKAPI_CALL loader_layer_create_device(VkInstance instance, VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkDevice *pDevice,
Expand Down Expand Up @@ -4288,6 +4315,8 @@ VKAPI_ATTR VkResult VKAPI_CALL loader_layer_create_device(VkInstance instance, V
goto out;
}

setup_logical_device_enabled_layer_extensions(inst, dev, &icd_exts, pCreateInfo);

res = loader_create_device_chain(internal_device, pCreateInfo, pAllocator, inst, dev, layerGIPA, nextGDPA);
if (res != VK_SUCCESS) {
loader_log(inst, VULKAN_LOADER_ERROR_BIT, 0, "vkCreateDevice: Failed to create device chain.");
Expand Down Expand Up @@ -5777,27 +5806,28 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDevice(VkPhysicalDevice physical
// not to return that terminator when vkGetDeviceProcAddr is called
for (uint32_t i = 0; i < localCreateInfo.enabledExtensionCount; ++i) {
if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
dev->extensions.khr_swapchain_enabled = true;
dev->driver_extensions.khr_swapchain_enabled = true;
} else if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME)) {
dev->extensions.khr_display_swapchain_enabled = true;
dev->driver_extensions.khr_display_swapchain_enabled = true;
} else if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], VK_KHR_DEVICE_GROUP_EXTENSION_NAME)) {
dev->extensions.khr_device_group_enabled = true;
dev->driver_extensions.khr_device_group_enabled = true;
} else if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) {
dev->extensions.ext_debug_marker_enabled = true;
dev->driver_extensions.ext_debug_marker_enabled = true;
} else if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], "VK_EXT_full_screen_exclusive")) {
dev->extensions.ext_full_screen_exclusive_enabled = true;
dev->driver_extensions.ext_full_screen_exclusive_enabled = true;
} else if (!strcmp(localCreateInfo.ppEnabledExtensionNames[i], VK_KHR_MAINTENANCE_5_EXTENSION_NAME) &&
maintenance5_feature_enabled) {
dev->should_ignore_device_commands_from_newer_version = true;
}
}
dev->extensions.ext_debug_utils_enabled = icd_term->this_instance->enabled_known_extensions.ext_debug_utils;
dev->layer_extensions.ext_debug_utils_enabled = icd_term->this_instance->enabled_known_extensions.ext_debug_utils;
dev->driver_extensions.ext_debug_utils_enabled = icd_term->this_instance->enabled_known_extensions.ext_debug_utils;

VkPhysicalDeviceProperties properties;
icd_term->dispatch.GetPhysicalDeviceProperties(phys_dev_term->phys_dev, &properties);
if (!dev->extensions.khr_device_group_enabled) {
if (!dev->driver_extensions.khr_device_group_enabled) {
if (properties.apiVersion >= VK_API_VERSION_1_1) {
dev->extensions.khr_device_group_enabled = true;
dev->driver_extensions.khr_device_group_enabled = true;
}
}

Expand Down
4 changes: 2 additions & 2 deletions loader/loader.rc
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
#include "winres.h"

// All set through CMake
#define VER_FILE_VERSION 1, 3, 261, 0
#define VER_FILE_DESCRIPTION_STR "1.3.261.Dev Build"
#define VER_FILE_VERSION 1, 3, 264, 0
#define VER_FILE_DESCRIPTION_STR "1.3.264.Dev Build"
#define VER_FILE_VERSION_STR "Vulkan Loader - Dev Build"
#define VER_COPYRIGHT_STR "Copyright (C) 2015-2023"

Expand Down
10 changes: 9 additions & 1 deletion loader/loader_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,14 @@ struct loader_device {

VkAllocationCallbacks alloc_callbacks;

// List of activated device extensions that layers support (but not necessarily the driver which have functions that require
// trampolines to work correctly. EX - vkDebugMarkerSetObjectNameEXT can name wrapped handles like instance, physical device,
// or surface
struct {
bool ext_debug_marker_enabled;
bool ext_debug_utils_enabled;
} layer_extensions;

// List of activated device extensions that have terminators implemented in the loader
struct {
bool khr_swapchain_enabled;
Expand All @@ -197,7 +205,7 @@ struct loader_device {
bool ext_debug_marker_enabled;
bool ext_debug_utils_enabled;
bool ext_full_screen_exclusive_enabled;
} extensions;
} driver_extensions;

struct loader_device *next;

Expand Down
Loading

0 comments on commit feb6fe6

Please sign in to comment.