@@ -55,6 +55,7 @@ typedef int HRESULT;
55
55
# include "vkd3d_dxgi1_4.h"
56
56
#else
57
57
# include <pthread.h>
58
+ # include "vkd3d.h"
58
59
# include "vkd3d_utils.h"
59
60
#endif
60
61
@@ -324,12 +325,170 @@ static inline bool is_amd_device(ID3D12Device *device)
324
325
return desc .VendorId == 0x1002 ;
325
326
}
326
327
#else
328
+ static bool have_VK_KHR_driver_properties ;
329
+
330
+ static HRESULT create_vkd3d_instance (struct vkd3d_instance * * instance )
331
+ {
332
+ struct vkd3d_optional_instance_extensions_info optional_extensions_info ;
333
+ struct vkd3d_instance_create_info instance_create_info ;
334
+
335
+ static const char * const optional_instance_extensions [] =
336
+ {
337
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME ,
338
+ };
339
+
340
+ memset (& optional_extensions_info , 0 , sizeof (optional_extensions_info ));
341
+ optional_extensions_info .type = VKD3D_STRUCTURE_TYPE_OPTIONAL_INSTANCE_EXTENSIONS_INFO ;
342
+ optional_extensions_info .extensions = optional_instance_extensions ;
343
+ optional_extensions_info .extension_count = ARRAY_SIZE (optional_instance_extensions );
344
+
345
+ memset (& instance_create_info , 0 , sizeof (instance_create_info ));
346
+ instance_create_info .type = VKD3D_STRUCTURE_TYPE_INSTANCE_CREATE_INFO ;
347
+ instance_create_info .next = & optional_extensions_info ;
348
+ instance_create_info .pfn_signal_event = vkd3d_signal_event ;
349
+ instance_create_info .wchar_size = sizeof (WCHAR );
350
+
351
+ return vkd3d_create_instance (& instance_create_info , instance );
352
+ }
353
+
354
+ static HRESULT create_vkd3d_device (struct vkd3d_instance * instance ,
355
+ D3D_FEATURE_LEVEL minimum_feature_level , REFIID iid , void * * device )
356
+ {
357
+ struct vkd3d_device_create_info device_create_info ;
358
+
359
+ static const char * const device_extensions [] =
360
+ {
361
+ VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME ,
362
+ };
363
+
364
+ memset (& device_create_info , 0 , sizeof (device_create_info ));
365
+ device_create_info .type = VKD3D_STRUCTURE_TYPE_DEVICE_CREATE_INFO ;
366
+ device_create_info .minimum_feature_level = minimum_feature_level ;
367
+ device_create_info .instance = instance ;
368
+ if (have_VK_KHR_driver_properties )
369
+ {
370
+ device_create_info .device_extensions = device_extensions ;
371
+ device_create_info .device_extension_count = ARRAY_SIZE (device_extensions );
372
+ }
373
+
374
+ return vkd3d_create_device (& device_create_info , iid , device );
375
+ }
376
+
377
+ static bool check_device_extension (VkPhysicalDevice vk_physical_device , const char * name )
378
+ {
379
+ VkExtensionProperties * properties ;
380
+ bool ret = false;
381
+ unsigned int i ;
382
+ uint32_t count ;
383
+ VkResult vr ;
384
+
385
+ vr = vkEnumerateDeviceExtensionProperties (vk_physical_device , NULL , & count , NULL );
386
+ ok (vr == VK_SUCCESS , "Got unexpected VkResult %d.\n" , vr );
387
+ if (!count )
388
+ return false;
389
+
390
+ properties = calloc (count , sizeof (* properties ));
391
+ ok (properties , "Failed to allocate memory.\n" );
392
+
393
+ vr = vkEnumerateDeviceExtensionProperties (vk_physical_device , NULL , & count , properties );
394
+ ok (vr == VK_SUCCESS , "Got unexpected VkResult %d.\n" , vr );
395
+ for (i = 0 ; i < count ; ++ i )
396
+ {
397
+ if (!strcmp (properties [i ].extensionName , name ))
398
+ {
399
+ ret = true;
400
+ break ;
401
+ }
402
+ }
403
+
404
+ free (properties );
405
+ return ret ;
406
+ }
407
+
408
+ HRESULT WINAPI D3D12CreateDevice (IUnknown * adapter ,
409
+ D3D_FEATURE_LEVEL minimum_feature_level , REFIID iid , void * * device )
410
+ {
411
+ struct vkd3d_instance * instance ;
412
+ HRESULT hr ;
413
+
414
+ if (SUCCEEDED (hr = create_vkd3d_instance (& instance )))
415
+ {
416
+ hr = create_vkd3d_device (instance , minimum_feature_level , iid , device );
417
+ vkd3d_instance_decref (instance );
418
+ }
419
+
420
+ return hr ;
421
+ }
422
+
327
423
static IUnknown * create_adapter (void )
328
424
{
329
425
return NULL ;
330
426
}
331
427
332
- static void init_adapter_info (void ) {}
428
+ static void init_adapter_info (void )
429
+ {
430
+ PFN_vkGetPhysicalDeviceProperties2KHR pfn_vkGetPhysicalDeviceProperties2KHR ;
431
+ VkPhysicalDeviceDriverPropertiesKHR driver_properties ;
432
+ VkPhysicalDeviceProperties2 device_properties2 ;
433
+ VkPhysicalDevice * vk_physical_devices ;
434
+ VkPhysicalDevice vk_physical_device ;
435
+ struct vkd3d_instance * instance ;
436
+ VkInstance vk_instance ;
437
+ ID3D12Device * device ;
438
+ uint32_t count , i ;
439
+ VkResult vr ;
440
+ HRESULT hr ;
441
+
442
+ if (FAILED (hr = create_vkd3d_instance (& instance )))
443
+ return ;
444
+
445
+ vk_instance = vkd3d_instance_get_vk_instance (instance );
446
+
447
+ vr = vkEnumeratePhysicalDevices (vk_instance , & count , NULL );
448
+ ok (vr == VK_SUCCESS , "Got unexpected VkResult %d.\n" , vr );
449
+ vk_physical_devices = calloc (count , sizeof (* vk_physical_devices ));
450
+ ok (vk_physical_devices , "Failed to allocate memory.\n" );
451
+ vr = vkEnumeratePhysicalDevices (vk_instance , & count , vk_physical_devices );
452
+ ok (vr == VK_SUCCESS , "Got unexpected VkResult %d.\n" , vr );
453
+
454
+ have_VK_KHR_driver_properties = true;
455
+ for (i = 0 ; i < count ; ++ i )
456
+ {
457
+ if (!check_device_extension (vk_physical_devices [i ],VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME ))
458
+ {
459
+ have_VK_KHR_driver_properties = false;
460
+ break ;
461
+ }
462
+ }
463
+
464
+ free (vk_physical_devices );
465
+
466
+ if (!have_VK_KHR_driver_properties )
467
+ goto done ;
468
+
469
+ if (FAILED (hr = create_vkd3d_device (instance , D3D_FEATURE_LEVEL_11_0 , & IID_ID3D12Device , (void * * )& device )))
470
+ goto done ;
471
+
472
+ vk_physical_device = vkd3d_get_vk_physical_device (device );
473
+
474
+ pfn_vkGetPhysicalDeviceProperties2KHR
475
+ = (void * )vkGetInstanceProcAddr (vk_instance , "vkGetPhysicalDeviceProperties2KHR" );
476
+ ok (pfn_vkGetPhysicalDeviceProperties2KHR , "vkGetPhysicalDeviceProperties2KHR is NULL.\n" );
477
+
478
+ memset (& device_properties2 , 0 , sizeof (device_properties2 ));
479
+ device_properties2 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 ;
480
+ device_properties2 .pNext = & driver_properties ;
481
+ memset (& driver_properties , 0 , sizeof (driver_properties ));
482
+ driver_properties .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR ;
483
+ pfn_vkGetPhysicalDeviceProperties2KHR (vk_physical_device , & device_properties2 );
484
+
485
+ trace ("Driver name: %s, driver info: %s.\n" , driver_properties .driverName , driver_properties .driverInfo );
486
+
487
+ ID3D12Device_Release (device );
488
+
489
+ done :
490
+ vkd3d_instance_decref (instance );
491
+ }
333
492
334
493
static inline bool is_amd_device (ID3D12Device * device )
335
494
{
0 commit comments