aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Elliott <ianelliott@google.com>2016-01-04 14:10:30 -0700
committerJon Ashburn <jon@lunarg.com>2016-01-06 12:23:09 -0700
commita7f9d66d4b1eab2da24b530a7d668f40b63bf0c3 (patch)
tree7a7dcfc7c22e5154a25bde37b205261d7b453c02
parent46b7632a4518c217ffdcee400a2f8063f0494242 (diff)
downloadusermoji-a7f9d66d4b1eab2da24b530a7d668f40b63bf0c3.tar.xz
Swapchain: Track/use enablement of the WSI platform extensions.
The old code either wasn't checking, or was using the enablment of the surface extension instead of the correct platform extension
-rw-r--r--layers/swapchain.cpp108
-rw-r--r--layers/swapchain.h24
2 files changed, 115 insertions, 17 deletions
diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp
index 3d3c09b0..b4758897 100644
--- a/layers/swapchain.cpp
+++ b/layers/swapchain.cpp
@@ -182,6 +182,25 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreate
// was enabled for it:
my_data->instanceMap[instance].instance = instance;
my_data->instanceMap[instance].surfaceExtensionEnabled = false;
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ my_data->instanceMap[instance].androidSurfaceExtensionEnabled = false;
+#endif // VK_USE_PLATFORM_ANDROID_KHR
+#ifdef VK_USE_PLATFORM_MIR_KHR
+ my_data->instanceMap[instance].mirSurfaceExtensionEnabled = false;
+#endif // VK_USE_PLATFORM_MIR_KHR
+#ifdef VK_USE_PLATFORM_WAYLAND_KHR
+ my_data->instanceMap[instance].waylandSurfaceExtensionEnabled = false;
+#endif // VK_USE_PLATFORM_WAYLAND_KHR
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+ my_data->instanceMap[instance].win32SurfaceExtensionEnabled = false;
+#endif // VK_USE_PLATFORM_WIN32_KHR
+#ifdef VK_USE_PLATFORM_XCB_KHR
+ my_data->instanceMap[instance].xcbSurfaceExtensionEnabled = false;
+#endif // VK_USE_PLATFORM_XCB_KHR
+#ifdef VK_USE_PLATFORM_XLIB_KHR
+ my_data->instanceMap[instance].xlibSurfaceExtensionEnabled = false;
+#endif // VK_USE_PLATFORM_XLIB_KHR
+
// Record whether the WSI instance extension was enabled for this
// VkInstance. No need to check if the extension was advertised by
@@ -191,6 +210,37 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo* pCreate
my_data->instanceMap[instance].surfaceExtensionEnabled = true;
}
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_ANDROID_SURFACE_EXTENSION_NAME) == 0) {
+
+ my_data->instanceMap[instance].androidSurfaceExtensionEnabled = true;
+#endif // VK_USE_PLATFORM_ANDROID_KHR
+#ifdef VK_USE_PLATFORM_MIR_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
+
+ my_data->instanceMap[instance].mirSurfaceExtensionEnabled = true;
+#endif // VK_USE_PLATFORM_MIR_KHR
+#ifdef VK_USE_PLATFORM_WAYLAND_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
+
+ my_data->instanceMap[instance].waylandSurfaceExtensionEnabled = true;
+#endif // VK_USE_PLATFORM_WAYLAND_KHR
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
+
+ my_data->instanceMap[instance].win32SurfaceExtensionEnabled = true;
+#endif // VK_USE_PLATFORM_WIN32_KHR
+#ifdef VK_USE_PLATFORM_XCB_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
+
+ my_data->instanceMap[instance].xcbSurfaceExtensionEnabled = true;
+#endif // VK_USE_PLATFORM_XCB_KHR
+#ifdef VK_USE_PLATFORM_XLIB_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
+
+ my_data->instanceMap[instance].xlibSurfaceExtensionEnabled = true;
+#endif // VK_USE_PLATFORM_XLIB_KHR
+ }
}
}
@@ -451,20 +501,20 @@ VK_LAYER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceMirPresentatio
VkBool32 skipCall = VK_FALSE;
layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
- // Validate that a valid VkPhysicalDevice was used, and that the instance
+ // Validate that a valid VkPhysicalDevice was used, and that the platform
// extension was enabled:
SwpPhysicalDevice *pPhysicalDevice = &my_data->physicalDeviceMap[physicalDevice];
if (!pPhysicalDevice || !pPhysicalDevice->pInstance) {
skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
physicalDevice,
"VkPhysicalDevice");
- } else if (!pPhysicalDevice->pInstance->surfaceExtensionEnabled) {
+ } else if (!pPhysicalDevice->pInstance->mirSurfaceExtensionEnabled) {
skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
pPhysicalDevice->pInstance,
"VkInstance",
SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
"%s() called even though the %s extension was not enabled for this VkInstance.",
- __FUNCTION__, VK_KHR_SURFACE_EXTENSION_NAME);
+ __FUNCTION__, VK_KHR_MIR_SURFACE_EXTENSION_NAME);
}
if (VK_FALSE == skipCall) {
@@ -545,20 +595,20 @@ VK_LAYER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresent
VkBool32 skipCall = VK_FALSE;
layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
- // Validate that a valid VkPhysicalDevice was used, and that the instance
+ // Validate that a valid VkPhysicalDevice was used, and that the platform
// extension was enabled:
SwpPhysicalDevice *pPhysicalDevice = &my_data->physicalDeviceMap[physicalDevice];
if (!pPhysicalDevice || !pPhysicalDevice->pInstance) {
skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
physicalDevice,
"VkPhysicalDevice");
- } else if (!pPhysicalDevice->pInstance->surfaceExtensionEnabled) {
+ } else if (!pPhysicalDevice->pInstance->waylandSurfaceExtensionEnabled) {
skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
pPhysicalDevice->pInstance,
"VkInstance",
SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
"%s() called even though the %s extension was not enabled for this VkInstance.",
- __FUNCTION__, VK_KHR_SURFACE_EXTENSION_NAME);
+ __FUNCTION__, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
}
if (VK_FALSE == skipCall) {
@@ -638,20 +688,20 @@ VK_LAYER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32Presentat
VkBool32 skipCall = VK_FALSE;
layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
- // Validate that a valid VkPhysicalDevice was used, and that the instance
+ // Validate that a valid VkPhysicalDevice was used, and that the platform
// extension was enabled:
SwpPhysicalDevice *pPhysicalDevice = &my_data->physicalDeviceMap[physicalDevice];
if (!pPhysicalDevice || !pPhysicalDevice->pInstance) {
skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
physicalDevice,
"VkPhysicalDevice");
- } else if (!pPhysicalDevice->pInstance->surfaceExtensionEnabled) {
+ } else if (!pPhysicalDevice->pInstance->win32SurfaceExtensionEnabled) {
skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
pPhysicalDevice->pInstance,
"VkInstance",
SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
"%s() called even though the %s extension was not enabled for this VkInstance.",
- __FUNCTION__, VK_KHR_SURFACE_EXTENSION_NAME);
+ __FUNCTION__, VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
}
if (VK_FALSE == skipCall) {
@@ -733,20 +783,20 @@ VK_LAYER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentatio
VkBool32 skipCall = VK_FALSE;
layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
- // Validate that a valid VkPhysicalDevice was used, and that the instance
+ // Validate that a valid VkPhysicalDevice was used, and that the platform
// extension was enabled:
SwpPhysicalDevice *pPhysicalDevice = &my_data->physicalDeviceMap[physicalDevice];
if (!pPhysicalDevice || !pPhysicalDevice->pInstance) {
skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
physicalDevice,
"VkPhysicalDevice");
- } else if (!pPhysicalDevice->pInstance->surfaceExtensionEnabled) {
+ } else if (!pPhysicalDevice->pInstance->xcbSurfaceExtensionEnabled) {
skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
pPhysicalDevice->pInstance,
"VkInstance",
SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
"%s() called even though the %s extension was not enabled for this VkInstance.",
- __FUNCTION__, VK_KHR_SURFACE_EXTENSION_NAME);
+ __FUNCTION__, VK_KHR_XCB_SURFACE_EXTENSION_NAME);
}
if (VK_FALSE == skipCall) {
@@ -828,20 +878,20 @@ VK_LAYER_EXPORT VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentati
VkBool32 skipCall = VK_FALSE;
layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map);
- // Validate that a valid VkPhysicalDevice was used, and that the instance
+ // Validate that a valid VkPhysicalDevice was used, and that the platform
// extension was enabled:
SwpPhysicalDevice *pPhysicalDevice = &my_data->physicalDeviceMap[physicalDevice];
if (!pPhysicalDevice || !pPhysicalDevice->pInstance) {
skipCall |= LOG_ERROR_NON_VALID_OBJ(VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
physicalDevice,
"VkPhysicalDevice");
- } else if (!pPhysicalDevice->pInstance->surfaceExtensionEnabled) {
+ } else if (!pPhysicalDevice->pInstance->xlibSurfaceExtensionEnabled) {
skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
pPhysicalDevice->pInstance,
"VkInstance",
SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED,
"%s() called even though the %s extension was not enabled for this VkInstance.",
- __FUNCTION__, VK_KHR_SURFACE_EXTENSION_NAME);
+ __FUNCTION__, VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
}
if (VK_FALSE == skipCall) {
@@ -2163,43 +2213,67 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(V
return addr;
}
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
if (my_data->instanceMap.size() != 0 &&
- my_data->instanceMap[instance].surfaceExtensionEnabled)
+ my_data->instanceMap[instance].androidSurfaceExtensionEnabled)
{
-#ifdef VK_USE_PLATFORM_ANDROID_KHR
if (!strcmp("vkCreateAndroidSurfaceKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkCreateAndroidSurfaceKHR);
+ }
#endif // VK_USE_PLATFORM_ANDROID_KHR
#ifdef VK_USE_PLATFORM_MIR_KHR
+ if (my_data->instanceMap.size() != 0 &&
+ my_data->instanceMap[instance].mirSurfaceExtensionEnabled)
+ {
if (!strcmp("vkCreateMirSurfaceKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkCreateMirSurfaceKHR);
if (!strcmp("vkGetPhysicalDeviceMirPresentationSupportKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceMirPresentationSupportKHR);
+ }
#endif // VK_USE_PLATFORM_MIR_KHR
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
+ if (my_data->instanceMap.size() != 0 &&
+ my_data->instanceMap[instance].waylandSurfaceExtensionEnabled)
+ {
if (!strcmp("vkCreateWaylandSurfaceKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkCreateWaylandSurfaceKHR);
if (!strcmp("vkGetPhysicalDeviceWaylandPresentationSupportKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceWaylandPresentationSupportKHR);
+ }
#endif // VK_USE_PLATFORM_WAYLAND_KHR
#ifdef VK_USE_PLATFORM_WIN32_KHR
+ if (my_data->instanceMap.size() != 0 &&
+ my_data->instanceMap[instance].win32SurfaceExtensionEnabled)
+ {
if (!strcmp("vkCreateWin32SurfaceKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkCreateWin32SurfaceKHR);
if (!strcmp("vkGetPhysicalDeviceWin32PresentationSupportKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceWin32PresentationSupportKHR);
+ }
#endif // VK_USE_PLATFORM_WIN32_KHR
#ifdef VK_USE_PLATFORM_XCB_KHR
+ if (my_data->instanceMap.size() != 0 &&
+ my_data->instanceMap[instance].xcbSurfaceExtensionEnabled)
+ {
if (!strcmp("vkCreateXcbSurfaceKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkCreateXcbSurfaceKHR);
if (!strcmp("vkGetPhysicalDeviceXcbPresentationSupportKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceXcbPresentationSupportKHR);
+ }
#endif // VK_USE_PLATFORM_XCB_KHR
#ifdef VK_USE_PLATFORM_XLIB_KHR
+ if (my_data->instanceMap.size() != 0 &&
+ my_data->instanceMap[instance].xlibSurfaceExtensionEnabled)
+ {
if (!strcmp("vkCreateXlibSurfaceKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkCreateXlibSurfaceKHR);
if (!strcmp("vkGetPhysicalDeviceXlibPresentationSupportKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceXlibPresentationSupportKHR);
+ }
#endif // VK_USE_PLATFORM_XLIB_KHR
+ if (my_data->instanceMap.size() != 0 &&
+ my_data->instanceMap[instance].surfaceExtensionEnabled)
+ {
if (!strcmp("vkDestroySurfaceKHR", funcName))
return reinterpret_cast<PFN_vkVoidFunction>(vkDestroySurfaceKHR);
if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", funcName))
diff --git a/layers/swapchain.h b/layers/swapchain.h
index 55c228db..852861bc 100644
--- a/layers/swapchain.h
+++ b/layers/swapchain.h
@@ -181,6 +181,30 @@ struct _SwpInstance {
bool surfaceExtensionEnabled;
// TODO: Add additional booleans for platform-specific extensions:
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ // Set to true if VK_KHR_ANDROID_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
+ bool androidSurfaceExtensionEnabled;
+#endif // VK_USE_PLATFORM_ANDROID_KHR
+#ifdef VK_USE_PLATFORM_MIR_KHR
+ // Set to true if VK_KHR_MIR_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
+ bool mirSurfaceExtensionEnabled;
+#endif // VK_USE_PLATFORM_MIR_KHR
+#ifdef VK_USE_PLATFORM_WAYLAND_KHR
+ // Set to true if VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
+ bool waylandSurfaceExtensionEnabled;
+#endif // VK_USE_PLATFORM_WAYLAND_KHR
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+ // Set to true if VK_KHR_WIN32_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
+ bool win32SurfaceExtensionEnabled;
+#endif // VK_USE_PLATFORM_WIN32_KHR
+#ifdef VK_USE_PLATFORM_XCB_KHR
+ // Set to true if VK_KHR_XCB_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
+ bool xcbSurfaceExtensionEnabled;
+#endif // VK_USE_PLATFORM_XCB_KHR
+#ifdef VK_USE_PLATFORM_XLIB_KHR
+ // Set to true if VK_KHR_XLIB_SURFACE_EXTENSION_NAME was enabled for this VkInstance:
+ bool xlibSurfaceExtensionEnabled;
+#endif // VK_USE_PLATFORM_XLIB_KHR
};
// Create one of these for each VkSurfaceKHR: