@@ -4143,7 +4143,10 @@ static void demo_init_vk(struct demo *demo) {
4143
4143
}
4144
4144
4145
4145
volkLoadInstance (demo -> inst );
4146
+ }
4146
4147
4148
+ static void demo_select_physical_device (struct demo * demo ) {
4149
+ VkResult err ;
4147
4150
/* Make initial call to query gpu_count, then second call for gpu info */
4148
4151
uint32_t gpu_count = 0 ;
4149
4152
err = vkEnumeratePhysicalDevices (demo -> inst , & gpu_count , NULL );
@@ -4188,7 +4191,10 @@ static void demo_init_vk(struct demo *demo) {
4188
4191
for (uint32_t i = 0 ; i < gpu_count ; i ++ ) {
4189
4192
vkGetPhysicalDeviceProperties (physical_devices [i ], & physicalDeviceProperties );
4190
4193
assert (physicalDeviceProperties .deviceType <= VK_PHYSICAL_DEVICE_TYPE_CPU );
4191
- count_device_type [physicalDeviceProperties .deviceType ]++ ;
4194
+ VkBool32 supported = 0 ;
4195
+ vkGetPhysicalDeviceSurfaceSupportKHR (physical_devices [i ], 0 , demo -> surface , & supported );
4196
+ if (supported )
4197
+ count_device_type [physicalDeviceProperties .deviceType ]++ ;
4192
4198
}
4193
4199
4194
4200
VkPhysicalDeviceType search_for_device_type = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU ;
@@ -4298,6 +4304,24 @@ static void demo_init_vk(struct demo *demo) {
4298
4304
}
4299
4305
4300
4306
if (demo -> validate ) {
4307
+ /*
4308
+ * This is info for a temp callback to use during CreateInstance.
4309
+ * After the instance is created, we use the instance-based
4310
+ * function to register the final callback.
4311
+ */
4312
+ VkDebugUtilsMessengerCreateInfoEXT dbg_messenger_create_info ;
4313
+ // VK_EXT_debug_utils style
4314
+ dbg_messenger_create_info .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT ;
4315
+ dbg_messenger_create_info .pNext = NULL ;
4316
+ dbg_messenger_create_info .flags = 0 ;
4317
+ dbg_messenger_create_info .messageSeverity =
4318
+ VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT ;
4319
+ dbg_messenger_create_info .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
4320
+ VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
4321
+ VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT ;
4322
+ dbg_messenger_create_info .pfnUserCallback = debug_messenger_callback ;
4323
+ dbg_messenger_create_info .pUserData = demo ;
4324
+
4301
4325
err = vkCreateDebugUtilsMessengerEXT (demo -> inst , & dbg_messenger_create_info , NULL , & demo -> dbg_messenger );
4302
4326
switch (err ) {
4303
4327
case VK_SUCCESS :
@@ -4492,8 +4516,6 @@ static VkSurfaceFormatKHR pick_surface_format(const VkSurfaceFormatKHR *surfaceF
4492
4516
static void demo_init_vk_swapchain (struct demo * demo ) {
4493
4517
VkResult U_ASSERT_ONLY err ;
4494
4518
4495
- demo_create_surface (demo );
4496
-
4497
4519
// Iterate over each queue to learn whether it supports presenting:
4498
4520
VkBool32 * supportsPresent = (VkBool32 * )malloc (demo -> queue_family_count * sizeof (VkBool32 ));
4499
4521
for (uint32_t i = 0 ; i < demo -> queue_family_count ; i ++ ) {
@@ -4868,6 +4890,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine,
4868
4890
demo .connection = hInstance ;
4869
4891
strncpy (demo .name , "Vulkan Cube" , APP_NAME_STR_LEN );
4870
4892
demo_create_window (& demo );
4893
+ demo_create_surface (& demo );
4894
+ demo_select_physical_device (& demo );
4871
4895
demo_init_vk_swapchain (& demo );
4872
4896
4873
4897
demo_prepare (& demo );
@@ -4906,6 +4930,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine,
4906
4930
#if defined(VK_USE_PLATFORM_METAL_EXT )
4907
4931
static void demo_main (struct demo * demo , void * caMetalLayer , int argc , const char * argv []) {
4908
4932
demo_init (demo , argc , (char * * )argv );
4933
+ demo_create_surface (demo );
4934
+ demo_select_physical_device (demo );
4909
4935
demo -> caMetalLayer = caMetalLayer ;
4910
4936
demo_init_vk_swapchain (demo );
4911
4937
demo_prepare (demo );
@@ -4959,6 +4985,8 @@ static void processCommand(struct android_app *app, int32_t cmd) {
4959
4985
for (int i = 0 ; i < argc ; i ++ ) free (argv [i ]);
4960
4986
4961
4987
demo .window = (void * )app -> window ;
4988
+ demo_create_surface (& demo );
4989
+ demo_select_physical_device (& demo );
4962
4990
demo_init_vk_swapchain (& demo );
4963
4991
demo_prepare (& demo );
4964
4992
initialized = true;
@@ -5044,6 +5072,8 @@ int main(int argc, char **argv) {
5044
5072
break ;
5045
5073
#endif
5046
5074
}
5075
+ demo_create_surface (& demo );
5076
+ demo_select_physical_device (& demo );
5047
5077
5048
5078
demo_init_vk_swapchain (& demo );
5049
5079
0 commit comments