11#include <emscripten/emscripten.h>
2+ #include <volk.h>
23#include <stdio.h>
34#include <string.h>
4- #include <vulkan/vulkan.h>
55
66VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr (VkInstance instance , const char * pName );
77
88EMSCRIPTEN_KEEPALIVE int lavapipe_runtime_smoke (void ) {
9- PFN_vkCreateInstance createInstance = (PFN_vkCreateInstance )vk_icdGetInstanceProcAddr (VK_NULL_HANDLE , "vkCreateInstance" );
10- PFN_vkEnumerateInstanceVersion enumerateVersion = (PFN_vkEnumerateInstanceVersion )vk_icdGetInstanceProcAddr (VK_NULL_HANDLE , "vkEnumerateInstanceVersion" );
11-
12- if (!createInstance || !enumerateVersion ) {
9+ volkInitializeCustom ((PFN_vkGetInstanceProcAddr )vk_icdGetInstanceProcAddr );
10+ if (!vkCreateInstance || !vkEnumerateInstanceVersion ) {
1311 return 21 ;
1412 }
1513
1614 uint32_t apiVersion = 0u ;
17- VkResult rc = enumerateVersion (& apiVersion );
15+ VkResult rc = vkEnumerateInstanceVersion (& apiVersion );
1816 if (rc != VK_SUCCESS ) {
1917 return 22 ;
2018 }
@@ -34,27 +32,44 @@ EMSCRIPTEN_KEEPALIVE int lavapipe_runtime_smoke(void) {
3432 createInfo .pApplicationInfo = & appInfo ;
3533
3634 VkInstance instance = VK_NULL_HANDLE ;
37- rc = createInstance (& createInfo , 0 , & instance );
35+ rc = vkCreateInstance (& createInfo , 0 , & instance );
3836 if (rc != VK_SUCCESS || instance == VK_NULL_HANDLE ) {
3937 return 23 ;
4038 }
4139
42- PFN_vkEnumeratePhysicalDevices enumeratePhysicalDevices =
43- (PFN_vkEnumeratePhysicalDevices )vk_icdGetInstanceProcAddr (instance , "vkEnumeratePhysicalDevices" );
44- PFN_vkDestroyInstance destroyInstance =
45- (PFN_vkDestroyInstance )vk_icdGetInstanceProcAddr (instance , "vkDestroyInstance" );
46-
47- if (!enumeratePhysicalDevices || !destroyInstance ) {
40+ volkLoadInstance (instance );
41+ if (!vkEnumeratePhysicalDevices || !vkDestroyInstance || !vkGetDeviceProcAddr ) {
42+ vkDestroyInstance (instance , 0 );
4843 return 24 ;
4944 }
5045
5146 uint32_t physicalDeviceCount = 0u ;
52- rc = enumeratePhysicalDevices (instance , & physicalDeviceCount , 0 );
47+ rc = vkEnumeratePhysicalDevices (instance , & physicalDeviceCount , 0 );
5348 if (rc != VK_SUCCESS || physicalDeviceCount == 0u ) {
54- destroyInstance (instance , 0 );
49+ vkDestroyInstance (instance , 0 );
5550 return 25 ;
5651 }
5752
53+ VkPhysicalDevice physicalDevice = VK_NULL_HANDLE ;
54+ uint32_t one = 1u ;
55+ rc = vkEnumeratePhysicalDevices (instance , & one , & physicalDevice );
56+ if (rc != VK_SUCCESS || one == 0u || physicalDevice == VK_NULL_HANDLE ) {
57+ vkDestroyInstance (instance , 0 );
58+ return 26 ;
59+ }
60+
61+ PFN_vkVoidFunction fpEnumeratePhysicalDevices =
62+ vk_icdGetInstanceProcAddr (instance , "vkEnumeratePhysicalDevices" );
63+ PFN_vkVoidFunction fpGetPhysicalDeviceProperties =
64+ vk_icdGetInstanceProcAddr (instance , "vkGetPhysicalDeviceProperties" );
65+ PFN_vkVoidFunction fpGetPhysicalDeviceProperties2 =
66+ vk_icdGetInstanceProcAddr (instance , "vkGetPhysicalDeviceProperties2" );
67+
68+ if (!fpEnumeratePhysicalDevices || !fpGetPhysicalDeviceProperties || !fpGetPhysicalDeviceProperties2 ) {
69+ vkDestroyInstance (instance , 0 );
70+ return 27 ;
71+ }
72+
5873 printf ("lavapipe runtime smoke ok\n" );
5974 printf (" backend=mesa lavapipe (swrast)\n" );
6075 printf (" instance.api=%u.%u.%u (%u)\n" ,
@@ -65,8 +80,11 @@ EMSCRIPTEN_KEEPALIVE int lavapipe_runtime_smoke(void) {
6580 printf (" vkCreateInstance=ok\n" );
6681 printf (" vkEnumeratePhysicalDevices=ok\n" );
6782 printf (" physical_devices=%u\n" , physicalDeviceCount );
68- printf (" vk_icd.entrypoint=vk_icdGetInstanceProcAddr\n" );
69- destroyInstance (instance , 0 );
83+ printf (" vk_icdGetInstanceProcAddr(vkEnumeratePhysicalDevices)=present\n" );
84+ printf (" vk_icdGetInstanceProcAddr(vkGetPhysicalDeviceProperties)=present\n" );
85+ printf (" vk_icdGetInstanceProcAddr(vkGetPhysicalDeviceProperties2)=present\n" );
86+ printf (" vulkan_loader=volk (custom vk_icdGetInstanceProcAddr)\n" );
87+ vkDestroyInstance (instance , 0 );
7088 return 0 ;
7189}
7290
0 commit comments