77#include "vk_debug_utils.h"
88#include "wrapper_debug.h"
99#include "vk_printers.h"
10+ #include "graphics_env_hooks.h"
1011
1112const struct vk_instance_extension_table wrapper_instance_extensions = {
1213 .KHR_get_surface_capabilities2 = true,
@@ -52,6 +53,8 @@ static struct vk_instance_extension_table *supported_instance_extensions;
5253
5354#include <dlfcn.h>
5455
56+ static bool g_intercepted_layer_path = false;
57+
5558static void * get_vulkan_handle_icd ()
5659{
5760 char * path = getenv ("ADRENOTOOLS_DRIVER_PATH" );
@@ -64,6 +67,10 @@ static void *get_vulkan_handle_icd()
6467
6568 struct stat sb ;
6669
70+ if (CHECK_FLAG ("USE_VVL" )) {
71+ g_intercepted_layer_path = set_layer_paths ();
72+ }
73+
6774 if (hooks && path && (stat (path , & sb ) == 0 )) {
6875 WLOG ("get_vulkan_handle: hooks=%s, path=%s, name=%s" , hooks , path , name );
6976 char * temp ;
@@ -76,15 +83,8 @@ static void *get_vulkan_handle_icd()
7683 }
7784}
7885
79- // static void* icd_handle;
80-
8186static void * get_vulkan_handle ()
8287{
83- // __log("in get_vulkan_handle");
84- // if (!icd_handle)
85- // icd_handle = get_vulkan_handle_icd();
86- // void* vvl = dlopen("/data/user/0/com.winlator.cmod/files/imagefs/usr/lib/libVkLayer_khronos_validation.so", RTLD_NOW | RTLD_LOCAL);
87- // __log("Got vvl layer: %p", vvl);
8888 return get_vulkan_handle_icd ();
8989}
9090
@@ -298,43 +298,118 @@ WRAPPER_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
298298 wrapper_create_info .pApplicationInfo = & wrapper_application_info ;
299299 wrapper_create_info .enabledExtensionCount = wrapper_enable_extension_count ;
300300 wrapper_create_info .ppEnabledExtensionNames = wrapper_enable_extensions ;
301+
302+ const char * layers [wrapper_create_info .enabledLayerCount + 1 ];
303+ char time_str [20 ];
304+ char path [256 ];
305+ const char * log_filename [] = { path };
306+ const char * report_flags [] = { "error" , "info" , "warn" };
307+ VkBool32 validate_sync [] = { VK_TRUE };
308+ VkBool32 printf_enable [] = { VK_TRUE };
309+ VkBool32 printf_verbose [] = { VK_TRUE };
310+ VkBool32 validate_best_practices [] = { VK_TRUE };
311+ VkBool32 validate_best_practices_arm [] = { VK_TRUE };
312+
313+ const VkLayerSettingEXT layer_setting [] = {
314+ {
315+ "VK_LAYER_KHRONOS_validation" ,
316+ "log_filename" ,
317+ VK_LAYER_SETTING_TYPE_STRING_EXT ,
318+ 1 ,
319+ log_filename ,
320+ },
321+ {
322+ "VK_LAYER_KHRONOS_validation" ,
323+ "report_flags" ,
324+ VK_LAYER_SETTING_TYPE_STRING_EXT ,
325+ 3 ,
326+ report_flags ,
327+ },
328+ {
329+ "VK_LAYER_KHRONOS_validation" ,
330+ "validate_sync" ,
331+ VK_LAYER_SETTING_TYPE_BOOL32_EXT ,
332+ 1 ,
333+ validate_sync ,
334+ },
335+ {
336+ "VK_LAYER_KHRONOS_validation" ,
337+ "printf_enable" ,
338+ VK_LAYER_SETTING_TYPE_BOOL32_EXT ,
339+ 1 ,
340+ printf_enable ,
341+ },
342+ {
343+ "VK_LAYER_KHRONOS_validation" ,
344+ "printf_verbose" ,
345+ VK_LAYER_SETTING_TYPE_BOOL32_EXT ,
346+ 1 ,
347+ printf_verbose ,
348+ },
349+ {
350+ "VK_LAYER_KHRONOS_validation" ,
351+ "validate_best_practices" ,
352+ VK_LAYER_SETTING_TYPE_BOOL32_EXT ,
353+ 1 ,
354+ validate_best_practices ,
355+ },
356+ {
357+ "VK_LAYER_KHRONOS_validation" ,
358+ "validate_best_practices_arm" ,
359+ VK_LAYER_SETTING_TYPE_BOOL32_EXT ,
360+ 1 ,
361+ validate_best_practices_arm ,
362+ },
363+ };
364+
365+ VkLayerSettingsCreateInfoEXT layer_settings_create_info = {
366+ VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT ,
367+ NULL ,
368+ 3 ,
369+ layer_setting ,
370+ };
371+
372+ if (CHECK_FLAG ("USE_VVL" )) {
373+ if (!g_intercepted_layer_path ) {
374+ WLOGE ("Failed to intercept GraphicsEnv::SetLayerPaths(), cannot load VVL" );
375+ return vk_error (NULL , VK_ERROR_LAYER_NOT_PRESENT );
376+ }
377+
378+ uint32_t layerCount ;
379+ _vkEnumerateInstanceLayerProperties (& layerCount , NULL );
301380
302- // Initialize vvl
303- // if (icd_handle != vulkan_library_handle) {
304- // __log("Additional initialization - adding more pnext chains");
305- // VkLayerInstanceCreateInfo *chain_info = (VkLayerInstanceCreateInfo *)&wrapper_create_info;
306- // while ((chain_info->sType != VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO || chain_info->function != 0) && chain_info->pNext) {
307- // chain_info = (VkLayerInstanceCreateInfo *)&chain_info->pNext;
308- // }
309- // if (chain_info->sType == VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO && chain_info->function == 0) {
310- // __log("ERROR: Found a loader create info");
311- // unreachable("");
312- // } else {
313- // if (!chain_info->pNext) {
314- // __log("Starting new loader create info");
315- // void* next = dlsym(icd_handle, "vkGetInstanceProcAddr");
316- // __log("Next: %p", next);
317- // VkLayerInstanceLink deviceInfo = {
318- // .pfnNextGetInstanceProcAddr = next
319- // };
320-
321- // VkLayerInstanceCreateInfo info = {
322- // .sType = VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO,
323- // .function = 0,
324- // .u.pLayerInfo = &deviceInfo
325- // };
326- // chain_info->pNext = &info;
327- // __log("Created new loader create info");
328- // } else {
329- // __log("ERROR");
330- // unreachable("");
331- // }
332- // }
333- // }
381+ if (layerCount == 0 ) {
382+ WLOGE ("No layers found, make sure that /data/data/com.winlator.cmod/files/imagefs/usr/lib/libVkLayer_khronos_validation.so exists" );
383+ return vk_error (NULL , VK_ERROR_LAYER_NOT_PRESENT );
384+ } else {
385+ VkLayerProperties availableLayers [layerCount ];
386+ _vkEnumerateInstanceLayerProperties (& layerCount , availableLayers );
387+
388+ WLOGD ("Found %d layers in /data/data/com.winlator.cmod/files/imagefs/usr/lib/" , layerCount );
389+ for (int i = 0 ; i < layerCount ; i ++ ) {
390+ WLOGD (" Layer[%d]: %s" , i , availableLayers [i ].layerName );
391+ }
392+ }
393+
394+ wrapper_create_info .enabledLayerCount += 1 ;
395+ for (int i = 0 ; i < wrapper_create_info .enabledLayerCount - 1 ; i ++ ) {
396+ WLOGD ("enabled_layer[%d]: %s" , i , wrapper_create_info .ppEnabledLayerNames [i ]);
397+ layers [i ] = wrapper_create_info .ppEnabledLayerNames [i ];
398+ }
399+ layers [wrapper_create_info .enabledLayerCount - 1 ] = "VK_LAYER_KHRONOS_validation" ;
400+ wrapper_create_info .ppEnabledLayerNames = layers ;
401+
402+ get_current_time_string (time_str , sizeof (time_str ));
403+ sprintf (path , "/sdcard/Documents/Wrapper/%s_%s.%s.%d.txt" , "vvl" , time_str , getprogname (), getpid ());
404+ layer_settings_create_info .pNext = wrapper_create_info .pNext ;
405+ wrapper_create_info .pNext = & layer_settings_create_info ;
406+ }
334407
335408 result = dispatch_create_instance (& wrapper_create_info , pAllocator ,
336409 & instance -> dispatch_handle );
410+
337411 if (result != VK_SUCCESS ) {
412+ WLOGE ("vkCreateInstance failed, result = %d" , result );
338413 vk_instance_finish (& instance -> vk );
339414 vk_free2 (vk_default_allocator (), pAllocator , instance );
340415 return vk_error (NULL , result );
0 commit comments