Skip to content

Commit 1bc9d03

Browse files
Fix pAllocator in lazily allocated ICD surfaces
The pAllocator passed into each surface creation function would be a pointer to the instance's pAllocator callbacks, regardless of whether they were valid. This commit saves the VkAllocationCallbacks passed into the surface create function so that it can be used when the surface handle is actually created in the driver.
1 parent c7c8271 commit 1bc9d03

File tree

2 files changed

+49
-40
lines changed

2 files changed

+49
-40
lines changed

loader/wsi.c

+45-40
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,16 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
8282

8383
VkResult result = VK_SUCCESS;
8484
if (icd_term->scanned_icd->interface_version >= ICD_VER_SUPPORTS_ICD_SURFACE_KHR) {
85+
VkAllocationCallbacks *pAllocator = icd_surface->callbacks_valid ? &icd_surface->callbacks : NULL;
8586
if (VK_NULL_HANDLE == icd_term->surface_list.list[icd_surface->surface_index]) {
8687
// If the surface does not exist yet for the target ICD, then create it lazily
8788
switch (icd_surface->base.platform) {
8889
#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
8990
case VK_ICD_WSI_PLATFORM_WAYLAND:
9091
if (NULL != icd_term->dispatch.CreateWaylandSurfaceKHR) {
9192
result = icd_term->dispatch.CreateWaylandSurfaceKHR(
92-
icd_term->instance, (const VkWaylandSurfaceCreateInfoKHR *)icd_surface->create_info,
93-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
93+
icd_term->instance, (const VkWaylandSurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
94+
&icd_term->surface_list.list[icd_surface->surface_index]);
9495
} else {
9596
result = VK_ERROR_EXTENSION_NOT_PRESENT;
9697
}
@@ -101,8 +102,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
101102
case VK_ICD_WSI_PLATFORM_WIN32:
102103
if (NULL != icd_term->dispatch.CreateWin32SurfaceKHR) {
103104
result = icd_term->dispatch.CreateWin32SurfaceKHR(
104-
icd_term->instance, (const VkWin32SurfaceCreateInfoKHR *)icd_surface->create_info,
105-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
105+
icd_term->instance, (const VkWin32SurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
106+
&icd_term->surface_list.list[icd_surface->surface_index]);
106107
} else {
107108
result = VK_ERROR_EXTENSION_NOT_PRESENT;
108109
}
@@ -113,8 +114,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
113114
case VK_ICD_WSI_PLATFORM_XCB:
114115
if (NULL != icd_term->dispatch.CreateXcbSurfaceKHR) {
115116
result = icd_term->dispatch.CreateXcbSurfaceKHR(
116-
icd_term->instance, (const VkXcbSurfaceCreateInfoKHR *)icd_surface->create_info,
117-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
117+
icd_term->instance, (const VkXcbSurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
118+
&icd_term->surface_list.list[icd_surface->surface_index]);
118119
} else {
119120
result = VK_ERROR_EXTENSION_NOT_PRESENT;
120121
}
@@ -125,8 +126,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
125126
case VK_ICD_WSI_PLATFORM_XLIB:
126127
if (NULL != icd_term->dispatch.CreateXlibSurfaceKHR) {
127128
result = icd_term->dispatch.CreateXlibSurfaceKHR(
128-
icd_term->instance, (const VkXlibSurfaceCreateInfoKHR *)icd_surface->create_info,
129-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
129+
icd_term->instance, (const VkXlibSurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
130+
&icd_term->surface_list.list[icd_surface->surface_index]);
130131
} else {
131132
result = VK_ERROR_EXTENSION_NOT_PRESENT;
132133
}
@@ -137,8 +138,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
137138
case VK_ICD_WSI_PLATFORM_MACOS:
138139
if (NULL != icd_term->dispatch.CreateMacOSSurfaceMVK) {
139140
result = icd_term->dispatch.CreateMacOSSurfaceMVK(
140-
icd_term->instance, (const VkMacOSSurfaceCreateInfoMVK *)icd_surface->create_info,
141-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
141+
icd_term->instance, (const VkMacOSSurfaceCreateInfoMVK *)icd_surface->create_info, pAllocator,
142+
&icd_term->surface_list.list[icd_surface->surface_index]);
142143
} else {
143144
result = VK_ERROR_EXTENSION_NOT_PRESENT;
144145
}
@@ -148,8 +149,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
148149
case VK_ICD_WSI_PLATFORM_DISPLAY:
149150
if (NULL != icd_term->dispatch.CreateDisplayPlaneSurfaceKHR) {
150151
result = icd_term->dispatch.CreateDisplayPlaneSurfaceKHR(
151-
icd_term->instance, (const VkDisplaySurfaceCreateInfoKHR *)icd_surface->create_info,
152-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
152+
icd_term->instance, (const VkDisplaySurfaceCreateInfoKHR *)icd_surface->create_info, pAllocator,
153+
&icd_term->surface_list.list[icd_surface->surface_index]);
153154
} else {
154155
result = VK_ERROR_EXTENSION_NOT_PRESENT;
155156
}
@@ -158,8 +159,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
158159
case VK_ICD_WSI_PLATFORM_HEADLESS:
159160
if (NULL != icd_term->dispatch.CreateHeadlessSurfaceEXT) {
160161
result = icd_term->dispatch.CreateHeadlessSurfaceEXT(
161-
icd_term->instance, (const VkHeadlessSurfaceCreateInfoEXT *)icd_surface->create_info,
162-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
162+
icd_term->instance, (const VkHeadlessSurfaceCreateInfoEXT *)icd_surface->create_info, pAllocator,
163+
&icd_term->surface_list.list[icd_surface->surface_index]);
163164
} else {
164165
result = VK_ERROR_EXTENSION_NOT_PRESENT;
165166
}
@@ -169,8 +170,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
169170
case VK_ICD_WSI_PLATFORM_METAL:
170171
if (NULL != icd_term->dispatch.CreateMetalSurfaceEXT) {
171172
result = icd_term->dispatch.CreateMetalSurfaceEXT(
172-
icd_term->instance, (const VkMetalSurfaceCreateInfoEXT *)icd_surface->create_info,
173-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
173+
icd_term->instance, (const VkMetalSurfaceCreateInfoEXT *)icd_surface->create_info, pAllocator,
174+
&icd_term->surface_list.list[icd_surface->surface_index]);
174175
} else {
175176
result = VK_ERROR_EXTENSION_NOT_PRESENT;
176177
}
@@ -181,8 +182,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
181182
case VK_ICD_WSI_PLATFORM_DIRECTFB:
182183
if (NULL != icd_term->dispatch.CreateDirectFBSurfaceEXT) {
183184
result = icd_term->dispatch.CreateDirectFBSurfaceEXT(
184-
icd_term->instance, (const VkDirectFBSurfaceCreateInfoEXT *)icd_surface->create_info,
185-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
185+
icd_term->instance, (const VkDirectFBSurfaceCreateInfoEXT *)icd_surface->create_info, pAllocator,
186+
&icd_term->surface_list.list[icd_surface->surface_index]);
186187
} else {
187188
result = VK_ERROR_EXTENSION_NOT_PRESENT;
188189
}
@@ -193,8 +194,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
193194
case VK_ICD_WSI_PLATFORM_VI:
194195
if (NULL != icd_term->dispatch.CreateViSurfaceNN) {
195196
result = icd_term->dispatch.CreateViSurfaceNN(
196-
icd_term->instance, (const VkViSurfaceCreateInfoNN *)icd_surface->create_info,
197-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
197+
icd_term->instance, (const VkViSurfaceCreateInfoNN *)icd_surface->create_info, pAllocator,
198+
&icd_term->surface_list.list[icd_surface->surface_index]);
198199
} else {
199200
result = VK_ERROR_EXTENSION_NOT_PRESENT;
200201
}
@@ -206,7 +207,7 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
206207
if (NULL != icd_term->dispatch.CreateStreamDescriptorSurfaceGGP) {
207208
result = icd_term->dispatch.CreateStreamDescriptorSurfaceGGP(
208209
icd_term->instance, (const VkStreamDescriptorSurfaceCreateInfoGGP *)icd_surface->create_info,
209-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
210+
pAllocator, &icd_term->surface_list.list[icd_surface->surface_index]);
210211
} else {
211212
result = VK_ERROR_EXTENSION_NOT_PRESENT;
212213
}
@@ -217,8 +218,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
217218
case VK_ICD_WSI_PLATFORM_SCREEN:
218219
if (NULL != icd_term->dispatch.CreateScreenSurfaceQNX) {
219220
result = icd_term->dispatch.CreateScreenSurfaceQNX(
220-
icd_term->instance, (const VkScreenSurfaceCreateInfoQNX *)icd_surface->create_info,
221-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
221+
icd_term->instance, (const VkScreenSurfaceCreateInfoQNX *)icd_surface->create_info, pAllocator,
222+
&icd_term->surface_list.list[icd_surface->surface_index]);
222223
} else {
223224
result = VK_ERROR_EXTENSION_NOT_PRESENT;
224225
}
@@ -229,8 +230,8 @@ VkResult wsi_unwrap_icd_surface(struct loader_icd_term *icd_term, VkSurfaceKHR *
229230
case VK_ICD_WSI_PLATFORM_FUCHSIA:
230231
if (NULL != icd_term->dispatch.CreateImagePipeSurfaceFUCHSIA) {
231232
result = icd_term->dispatch.CreateImagePipeSurfaceFUCHSIA(
232-
icd_term->instance, (const VkImagePipeSurfaceCreateInfoFUCHSIA *)icd_surface->create_info,
233-
&icd_term->this_instance->alloc_callbacks, &icd_term->surface_list.list[icd_surface->surface_index]);
233+
icd_term->instance, (const VkImagePipeSurfaceCreateInfoFUCHSIA *)icd_surface->create_info, pAllocator,
234+
&icd_term->surface_list.list[icd_surface->surface_index]);
234235
} else {
235236
result = VK_ERROR_EXTENSION_NOT_PRESENT;
236237
}
@@ -754,7 +755,7 @@ VkResult allocate_icd_surface_struct(struct loader_instance *instance, size_t ba
754755
}
755756

756757
// Next, if so, proceed with the implementation of this function:
757-
icd_surface = loader_instance_heap_alloc(instance, sizeof(VkIcdSurface), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
758+
icd_surface = loader_instance_heap_calloc(instance, sizeof(VkIcdSurface), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
758759
if (icd_surface == NULL) {
759760
res = VK_ERROR_OUT_OF_HOST_MEMORY;
760761
goto out;
@@ -796,7 +797,7 @@ VkResult allocate_icd_surface_struct(struct loader_instance *instance, size_t ba
796797

797798
VkResult copy_surface_create_info(struct loader_instance *loader_inst, VkIcdSurface *icd_surface, const void *create_info,
798799
size_t struct_type_info_count, const struct loader_struct_type_info *struct_type_info,
799-
const char *base_struct_name) {
800+
const char *base_struct_name, const VkAllocationCallbacks *pAllocator) {
800801
size_t create_info_total_size = 0;
801802
const void *pnext = create_info;
802803
while (NULL != pnext) {
@@ -842,6 +843,10 @@ VkResult copy_surface_create_info(struct loader_instance *loader_inst, VkIcdSurf
842843
}
843844
}
844845
}
846+
if (pAllocator) {
847+
icd_surface->callbacks_valid = true;
848+
icd_surface->callbacks = *pAllocator;
849+
}
845850

846851
return VK_SUCCESS;
847852
}
@@ -922,7 +927,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWin32SurfaceKHR(VkInstance insta
922927
{VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, sizeof(VkWin32SurfaceCreateInfoKHR)},
923928
};
924929
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
925-
"VkWin32SurfaceCreateInfoKHR");
930+
"VkWin32SurfaceCreateInfoKHR", pAllocator);
926931

927932
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
928933

@@ -1021,7 +1026,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWaylandSurfaceKHR(VkInstance ins
10211026
{VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, sizeof(VkWaylandSurfaceCreateInfoKHR)},
10221027
};
10231028
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1024-
"VkWaylandSurfaceCreateInfoKHR");
1029+
"VkWaylandSurfaceCreateInfoKHR", pAllocator);
10251030

10261031
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
10271032

@@ -1124,7 +1129,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateXcbSurfaceKHR(VkInstance instanc
11241129
{VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, sizeof(VkXcbSurfaceCreateInfoKHR)},
11251130
};
11261131
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1127-
"VkXcbSurfaceCreateInfoKHR");
1132+
"VkXcbSurfaceCreateInfoKHR", pAllocator);
11281133

11291134
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
11301135

@@ -1230,7 +1235,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateXlibSurfaceKHR(VkInstance instan
12301235
{VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, sizeof(VkXlibSurfaceCreateInfoKHR)},
12311236
};
12321237
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1233-
"VkXlibSurfaceCreateInfoKHR");
1238+
"VkXlibSurfaceCreateInfoKHR", pAllocator);
12341239

12351240
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
12361241

@@ -1335,7 +1340,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDirectFBSurfaceEXT(VkInstance in
13351340
{VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT, sizeof(VkDirectFBSurfaceCreateInfoEXT)},
13361341
};
13371342
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1338-
"VkDirectFBSurfaceCreateInfoEXT");
1343+
"VkDirectFBSurfaceCreateInfoEXT", pAllocator);
13391344

13401345
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
13411346

@@ -1483,7 +1488,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateHeadlessSurfaceEXT(VkInstance in
14831488
{VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT, sizeof(VkHeadlessSurfaceCreateInfoEXT)},
14841489
};
14851490
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1486-
"VkHeadlessSurfaceCreateInfoEXT");
1491+
"VkHeadlessSurfaceCreateInfoEXT", pAllocator);
14871492

14881493
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
14891494

@@ -1569,7 +1574,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMacOSSurfaceMVK(VkInstance insta
15691574
{VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK, sizeof(VkMacOSSurfaceCreateInfoMVK)},
15701575
};
15711576
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1572-
"VkMacOSSurfaceCreateInfoMVK");
1577+
"VkMacOSSurfaceCreateInfoMVK", pAllocator);
15731578

15741579
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
15751580

@@ -1680,7 +1685,7 @@ terminator_CreateStreamDescriptorSurfaceGGP(VkInstance instance, const VkStreamD
16801685
{VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP, sizeof(VkStreamDescriptorSurfaceCreateInfoGGP)},
16811686
};
16821687
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1683-
"VkStreamDescriptorSurfaceCreateInfoGGP");
1688+
"VkStreamDescriptorSurfaceCreateInfoGGP", pAllocator);
16841689

16851690
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
16861691

@@ -1735,7 +1740,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateMetalSurfaceEXT(VkInstance insta
17351740
{VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT, sizeof(VkMetalSurfaceCreateInfoEXT)},
17361741
};
17371742
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1738-
"VkMetalSurfaceCreateInfoEXT");
1743+
"VkMetalSurfaceCreateInfoEXT", pAllocator);
17391744

17401745
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
17411746

@@ -1796,7 +1801,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateScreenSurfaceQNX(VkInstance inst
17961801
{VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX, sizeof(VkScreenSurfaceCreateInfoQNX)},
17971802
};
17981803
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1799-
"VkScreenSurfaceCreateInfoQNX");
1804+
"VkScreenSurfaceCreateInfoQNX", pAllocator);
18001805

18011806
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
18021807

@@ -1896,7 +1901,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateViSurfaceNN(VkInstance instance,
18961901
{VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN, sizeof(VkViSurfaceCreateInfoNN)},
18971902
};
18981903
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
1899-
"VkViSurfaceCreateInfoNN");
1904+
"VkViSurfaceCreateInfoNN", pAllocator);
19001905

19011906
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
19021907

@@ -2210,7 +2215,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDisplayPlaneSurfaceKHR(VkInstanc
22102215
{VK_STRUCTURE_TYPE_DISPLAY_SURFACE_STEREO_CREATE_INFO_NV, sizeof(VkDisplaySurfaceStereoCreateInfoNV)},
22112216
};
22122217
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
2213-
"VkDisplaySurfaceCreateInfoKHR");
2218+
"VkDisplaySurfaceCreateInfoKHR", pAllocator);
22142219

22152220
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
22162221

@@ -2639,7 +2644,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateImagePipeSurfaceFUCHSIA(VkInstan
26392644
{VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA, sizeof(VkImagePipeSurfaceCreateInfoFUCHSIA)},
26402645
};
26412646
copy_surface_create_info(loader_inst, icd_surface, pCreateInfo, sizeof(ci_types) / sizeof(ci_types[0]), ci_types,
2642-
"VkImagePipeSurfaceCreateInfoFUCHSIA");
2647+
"VkImagePipeSurfaceCreateInfoFUCHSIA", pAllocator);
26432648

26442649
*pSurface = (VkSurfaceKHR)(uintptr_t)icd_surface;
26452650

0 commit comments

Comments
 (0)