Skip to content

Commit 2526eac

Browse files
Only call surface creation functions on supported drivers
Make sure that the surface extension is supported by a driver and enabled before calling down on each surface creation function. This fixes crashes where a driver on the system doesn't support a surface extension that the application is using but still exposes the function pointer.
1 parent f16ad6f commit 2526eac

File tree

1 file changed

+33
-21
lines changed

1 file changed

+33
-21
lines changed

loader/wsi.c

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
8888
switch (icd_surface->base.platform) {
8989
#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
9090
case VK_ICD_WSI_PLATFORM_WAYLAND:
91-
if (NULL != icd_term->dispatch.CreateWaylandSurfaceKHR) {
91+
if (NULL != icd_term->dispatch.CreateWaylandSurfaceKHR &&
92+
icd_term->enabled_instance_extensions.khr_wayland_surface) {
9293
result = icd_term->dispatch.CreateWaylandSurfaceKHR(
9394
icd_term->instance, (const VkWaylandSurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
9495
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -100,7 +101,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
100101

101102
#if defined(VK_USE_PLATFORM_WIN32_KHR)
102103
case VK_ICD_WSI_PLATFORM_WIN32:
103-
if (NULL != icd_term->dispatch.CreateWin32SurfaceKHR) {
104+
if (NULL != icd_term->dispatch.CreateWin32SurfaceKHR &&
105+
icd_term->enabled_instance_extensions.khr_win32_surface) {
104106
result = icd_term->dispatch.CreateWin32SurfaceKHR(
105107
icd_term->instance, (const VkWin32SurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
106108
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -112,7 +114,7 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
112114

113115
#if defined(VK_USE_PLATFORM_XCB_KHR)
114116
case VK_ICD_WSI_PLATFORM_XCB:
115-
if (NULL != icd_term->dispatch.CreateXcbSurfaceKHR) {
117+
if (NULL != icd_term->dispatch.CreateXcbSurfaceKHR && icd_term->enabled_instance_extensions.khr_xcb_surface) {
116118
result = icd_term->dispatch.CreateXcbSurfaceKHR(
117119
icd_term->instance, (const VkXcbSurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
118120
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -124,7 +126,7 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
124126

125127
#if defined(VK_USE_PLATFORM_XLIB_KHR)
126128
case VK_ICD_WSI_PLATFORM_XLIB:
127-
if (NULL != icd_term->dispatch.CreateXlibSurfaceKHR) {
129+
if (NULL != icd_term->dispatch.CreateXlibSurfaceKHR && icd_term->enabled_instance_extensions.khr_xlib_surface) {
128130
result = icd_term->dispatch.CreateXlibSurfaceKHR(
129131
icd_term->instance, (const VkXlibSurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
130132
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -136,7 +138,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
136138

137139
#if defined(VK_USE_PLATFORM_MACOS_MVK)
138140
case VK_ICD_WSI_PLATFORM_MACOS:
139-
if (NULL != icd_term->dispatch.CreateMacOSSurfaceMVK) {
141+
if (NULL != icd_term->dispatch.CreateMacOSSurfaceMVK &&
142+
icd_term->enabled_instance_extensions.mvk_macos_surface) {
140143
result = icd_term->dispatch.CreateMacOSSurfaceMVK(
141144
icd_term->instance, (const VkMacOSSurfaceCreateInfoMVK *)icd_surface->create_info, pAllocator,
142145
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -147,7 +150,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
147150
#endif // VK_USE_PLATFORM_MACOS_MVK
148151

149152
case VK_ICD_WSI_PLATFORM_DISPLAY:
150-
if (NULL != icd_term->dispatch.CreateDisplayPlaneSurfaceKHR) {
153+
if (NULL != icd_term->dispatch.CreateDisplayPlaneSurfaceKHR &&
154+
icd_term->enabled_instance_extensions.khr_display) {
151155
result = icd_term->dispatch.CreateDisplayPlaneSurfaceKHR(
152156
icd_term->instance, (const VkDisplaySurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
153157
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -157,7 +161,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
157161
break;
158162

159163
case VK_ICD_WSI_PLATFORM_HEADLESS:
160-
if (NULL != icd_term->dispatch.CreateHeadlessSurfaceEXT) {
164+
if (NULL != icd_term->dispatch.CreateHeadlessSurfaceEXT &&
165+
icd_term->enabled_instance_extensions.ext_headless_surface) {
161166
result = icd_term->dispatch.CreateHeadlessSurfaceEXT(
162167
icd_term->instance, (const VkHeadlessSurfaceCreateInfoEXT *)icd_surface->create_info, pAllocator,
163168
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -168,7 +173,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
168173

169174
#if defined(VK_USE_PLATFORM_METAL_EXT)
170175
case VK_ICD_WSI_PLATFORM_METAL:
171-
if (NULL != icd_term->dispatch.CreateMetalSurfaceEXT) {
176+
if (NULL != icd_term->dispatch.CreateMetalSurfaceEXT &&
177+
icd_term->enabled_instance_extensions.ext_metal_surface) {
172178
result = icd_term->dispatch.CreateMetalSurfaceEXT(
173179
icd_term->instance, (const VkMetalSurfaceCreateInfoEXT *)icd_surface->create_info, pAllocator,
174180
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -180,7 +186,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
180186

181187
#if defined(VK_USE_PLATFORM_DIRECTFB_EXT)
182188
case VK_ICD_WSI_PLATFORM_DIRECTFB:
183-
if (NULL != icd_term->dispatch.CreateDirectFBSurfaceEXT) {
189+
if (NULL != icd_term->dispatch.CreateDirectFBSurfaceEXT &&
190+
icd_term->enabled_instance_extensions.ext_directfb_surface) {
184191
result = icd_term->dispatch.CreateDirectFBSurfaceEXT(
185192
icd_term->instance, (const VkDirectFBSurfaceCreateInfoEXT *)icd_surface->create_info, pAllocator,
186193
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -192,7 +199,7 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
192199

193200
#if defined(VK_USE_PLATFORM_VI_NN)
194201
case VK_ICD_WSI_PLATFORM_VI:
195-
if (NULL != icd_term->dispatch.CreateViSurfaceNN) {
202+
if (NULL != icd_term->dispatch.CreateViSurfaceNN && icd_term->enabled_instance_extensions.nn_vi_surface) {
196203
result = icd_term->dispatch.CreateViSurfaceNN(
197204
icd_term->instance, (const VkViSurfaceCreateInfoNN *)icd_surface->create_info, pAllocator,
198205
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -204,7 +211,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
204211

205212
#if defined(VK_USE_PLATFORM_GGP)
206213
case VK_ICD_WSI_PLATFORM_GGP:
207-
if (NULL != icd_term->dispatch.CreateStreamDescriptorSurfaceGGP) {
214+
if (NULL != icd_term->dispatch.CreateStreamDescriptorSurfaceGGP &&
215+
icd_term->enabled_instance_extensions.qnx_screen_surface) {
208216
result = icd_term->dispatch.CreateStreamDescriptorSurfaceGGP(
209217
icd_term->instance, (const VkStreamDescriptorSurfaceCreateInfoGGP *)icd_surface->create_info,
210218
pAllocator, &icd_term->surface_list.list[icd_surface->surface_index]);
@@ -216,7 +224,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
216224

217225
#if defined(VK_USE_PLATFORM_SCREEN_QNX)
218226
case VK_ICD_WSI_PLATFORM_SCREEN:
219-
if (NULL != icd_term->dispatch.CreateScreenSurfaceQNX) {
227+
if (NULL != icd_term->dispatch.CreateScreenSurfaceQNX &&
228+
icd_term->enabled_instance_extensions.qnx_screen_surface) {
220229
result = icd_term->dispatch.CreateScreenSurfaceQNX(
221230
icd_term->instance, (const VkScreenSurfaceCreateInfoQNX *)icd_surface->create_info, pAllocator,
222231
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -228,7 +237,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
228237

229238
#if defined(VK_USE_PLATFORM_FUCHSIA)
230239
case VK_ICD_WSI_PLATFORM_FUCHSIA:
231-
if (NULL != icd_term->dispatch.CreateImagePipeSurfaceFUCHSIA) {
240+
if (NULL != icd_term->dispatch.CreateImagePipeSurfaceFUCHSIA &&
241+
icd_term->enabled_instance_extensions.fuchsia_imagepipe_surface) {
232242
result = icd_term->dispatch.CreateImagePipeSurfaceFUCHSIA(
233243
icd_term->instance, (const VkImagePipeSurfaceCreateInfoFUCHSIA *)icd_surface->create_info, pAllocator,
234244
&icd_term->surface_list.list[icd_surface->surface_index]);
@@ -302,12 +312,13 @@ VKAPI_ATTR void VKAPI_CALL terminator_DestroySurfaceKHR(VkInstance instance, VkS
302312
VkIcdSurface *icd_surface = (VkIcdSurface *)(uintptr_t)(surface);
303313
if (NULL != icd_surface) {
304314
for (struct loader_icd_term *icd_term = loader_inst->icd_terms; icd_term != NULL; icd_term = icd_term->next) {
305-
if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
306-
if (NULL != icd_term->dispatch.DestroySurfaceKHR && icd_term->surface_list.list[icd_surface->surface_index]) {
307-
icd_term->dispatch.DestroySurfaceKHR(icd_term->instance,
308-
icd_term->surface_list.list[icd_surface->surface_index], pAllocator);
309-
icd_term->surface_list.list[icd_surface->surface_index] = (VkSurfaceKHR)(uintptr_t)NULL;
310-
}
315+
if (icd_term->enabled_instance_extensions.khr_surface &&
316+
icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR &&
317+
NULL != icd_term->dispatch.DestroySurfaceKHR && icd_term->surface_list.list[icd_surface->surface_index]) {
318+
icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, icd_term->surface_list.list[icd_surface->surface_index],
319+
pAllocator);
320+
icd_term->surface_list.list[icd_surface->surface_index] = (VkSurfaceKHR)(uintptr_t)NULL;
321+
311322
} else {
312323
// The real_icd_surface for any ICD not supporting the
313324
// proper interface version should be NULL. If not, then
@@ -671,7 +682,8 @@ VkResult allocate_icd_surface_struct(struct loader_instance *instance, size_t ba
671682
icd_surface->create_info = NULL;
672683

673684
for (struct loader_icd_term *icd_term = instance->icd_terms; icd_term != NULL; icd_term = icd_term->next) {
674-
if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
685+
if (icd_term->enabled_instance_extensions.khr_surface &&
686+
icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
675687
if (icd_term->surface_list.list == NULL) {
676688
res =
677689
loader_init_generic_list(instance, (struct loader_generic_list *)&icd_term->surface_list, sizeof(VkSurfaceKHR));
@@ -756,7 +768,7 @@ void cleanup_surface_creation(struct loader_instance *loader_inst, VkResult resu
756768
const VkAllocationCallbacks *pAllocator) {
757769
if (VK_SUCCESS != result && NULL != icd_surface) {
758770
for (struct loader_icd_term *icd_term = loader_inst->icd_terms; icd_term != NULL; icd_term = icd_term->next) {
759-
if (NULL != icd_term->surface_list.list &&
771+
if (icd_term->enabled_instance_extensions.khr_surface && NULL != icd_term->surface_list.list &&
760772
icd_term->surface_list.capacity > icd_surface->surface_index * sizeof(VkSurfaceKHR) &&
761773
icd_term->surface_list.list[icd_surface->surface_index] && NULL != icd_term->dispatch.DestroySurfaceKHR) {
762774
icd_term->dispatch.DestroySurfaceKHR(icd_term->instance, icd_term->surface_list.list[icd_surface->surface_index],

0 commit comments

Comments
 (0)