@@ -12,6 +12,26 @@ find_program(VulkanSC_PCCTOOL_EXECUTABLE
1212 "$ENV{VULKANSC_SDK} /bin"
1313)
1414
15+ function (resolve_vksc_pcc_executable PCC_EXECUTABLE PCC_JSON_PATH OUT_VAR)
16+ if (WIN32 )
17+ set (NATIVE_PATH_SEPARATOR_REGEX [[\\]])
18+ else ()
19+ set (NATIVE_PATH_SEPARATOR_REGEX [[/]])
20+ endif ()
21+ if (NOT PCC_EXECUTABLE MATCHES ${NATIVE_PATH_SEPARATOR_REGEX} )
22+ separate_arguments (PCC_EXECUTABLE NATIVE_COMMAND PROGRAM "${PCC_EXECUTABLE} " )
23+ else ()
24+ cmake_path(IS_RELATIVE PCC_EXECUTABLE PCC_EXECUTABLE_IS_RELATIVE)
25+ if (PCC_EXECUTABLE_IS_RELATIVE)
26+ cmake_path(GET PCC_JSON_PATH PARENT_PATH PCC_JSON_PARENT_PATH)
27+ cmake_path(ABSOLUTE_PATH PCC_EXECUTABLE BASE_DIRECTORY "${PCC_JSON_PARENT_PATH} " NORMALIZE)
28+ else ()
29+ cmake_path(NORMAL_PATH PCC_EXECUTABLE)
30+ endif ()
31+ endif ()
32+ set (${OUT_VAR} "${PCC_EXECUTABLE} " PARENT_SCOPE)
33+ endfunction ()
34+
1535# If a PCC executable is set manually then do not perform the PCC discovery
1636if (NOT "${VulkanSC_PCC_EXECUTABLE} " )
1737 if (WIN32 )
@@ -22,9 +42,12 @@ if(NOT "${VulkanSC_PCC_EXECUTABLE}")
2242 RESULT PCC_PROP_NAMES
2343 QUERY WINDOWS_REGISTRY "${HIVE} /SOFTWARE/Khronos/VulkanSC/PCC" VALUE_NAMES
2444 )
25- if (PCC_PROP_NAMES)
26- list (APPEND PCC_JSON_PATHS "${PCC_PROP_NAMES} " )
27- endif ()
45+ foreach (PCC_PROP_NAME IN LISTS PCC_PROP_NAMES)
46+ file (REAL_PATH "${PCC_PROP_NAME} " PCC_PROP_NAME)
47+ if (NOT PCC_PROP_NAME IN_LIST PCC_JSON_PATHS)
48+ list (APPEND PCC_JSON_PATHS "${PCC_PROP_NAME} " )
49+ endif ()
50+ endforeach ()
2851 endforeach ()
2952 else ()
3053 message (FATAL_ERROR "PCC (pipeline cache compiler) discovery on Windows requires CMake 3.24 or newer" )
@@ -42,9 +65,12 @@ if(NOT "${VulkanSC_PCC_EXECUTABLE}")
4265 /etc/xdg/vulkansc/pcc.d
4366 )
4467 file (GLOB PCC_GLOBBED_PATHS "${MANIFEST_DIR} /*.json" )
45- if (PCC_GLOBBED_PATHS)
46- list (APPEND PCC_JSON_PATHS "${PCC_GLOBBED_PATHS} " )
47- endif ()
68+ foreach (PCC_GLOBBED_PATH IN LISTS PCC_GLOBBED_PATHS)
69+ file (REAL_PATH "${PCC_GLOBBED_PATH} " PCC_GLOBBED_PATH)
70+ if (NOT PCC_GLOBBED_PATH IN_LIST PCC_JSON_PATHS)
71+ list (APPEND PCC_JSON_PATHS "${PCC_GLOBBED_PATH} " )
72+ endif ()
73+ endforeach ()
4874 endforeach ()
4975 endif ()
5076 foreach (PCC_JSON_PATH IN LISTS PCC_JSON_PATHS)
@@ -59,13 +85,9 @@ if(NOT "${VulkanSC_PCC_EXECUTABLE}")
5985 foreach (ARCH_INDEX RANGE ${ARCH_LENGTH_STOP} )
6086 string (JSON ARCH_NAME MEMBER "${PCC_JSON} " "architectures" ${ARCH_INDEX} )
6187 string (JSON PCC_EXECUTABLE GET "${PCC_JSON} " "architectures" ${ARCH_NAME} "pipeline_cache_compiler" )
62- cmake_path(IS_RELATIVE PCC_EXECUTABLE PCC_EXECUTABLE_IS_RELATIVE)
63- if (PCC_EXECUTABLE_IS_RELATIVE)
64- cmake_path(GET PCC_JSON_PATH PARENT_PATH PCC_JSON_PARENT_PATH)
65- cmake_path(ABSOLUTE_PATH PCC_EXECUTABLE BASE_DIRECTORY "${PCC_JSON_PARENT_PATH} " NORMALIZE)
66- else ()
67- cmake_path(NORMAL_PATH PCC_EXECUTABLE)
68- endif ()
88+ message (DEBUG "PCC entry: ${PCC_EXECUTABLE} " )
89+ resolve_vksc_pcc_executable("${PCC_EXECUTABLE} " "${PCC_JSON_PATH} " PCC_EXECUTABLE)
90+ message (DEBUG "PCC resolved: ${PCC_EXECUTABLE} " )
6991 string (JSON FLAGS GET "${PCC_JSON} " "architectures" ${ARCH_NAME} "pipeline_cache_flags" )
7092 string (JSON DEBUG_FLAG GET "${PCC_JSON} " "architectures" ${ARCH_NAME} "pipeline_cache_debug_flag" )
7193 string (JSON VENDOR_ID_FILTER ERROR_VARIABLE VENDOR_ID_FILTER_ERROR GET "${PCC_JSON} " "architectures" ${ARCH_NAME} "vendor_id_filter" )
@@ -129,13 +151,9 @@ if(NOT "${VulkanSC_PCC_EXECUTABLE}")
129151 set (DEVICE_ID "${CMAKE_MATCH_1} " )
130152 set (DEVICE_NAME "${CMAKE_MATCH_2} " )
131153 string (JSON PCC_EXECUTABLE GET "${PCC_JSON} " "devices" ${DEV_INDEX} "pipeline_cache_compiler" )
132- cmake_path(IS_RELATIVE PCC_EXECUTABLE PCC_EXECUTABLE_IS_RELATIVE)
133- if (PCC_EXECUTABLE_IS_RELATIVE)
134- cmake_path(GET PCC_JSON_PATH PARENT_PATH PCC_JSON_PARENT_PATH)
135- cmake_path(ABSOLUTE_PATH PCC_EXECUTABLE BASE_DIRECTORY "${PCC_JSON_PARENT_PATH} " NORMALIZE)
136- else ()
137- cmake_path(NORMAL_PATH PCC_EXECUTABLE)
138- endif ()
154+ message (DEBUG "PCC entry: ${PCC_EXECUTABLE} " )
155+ resolve_vksc_pcc_executable("${PCC_EXECUTABLE} " "${PCC_JSON_PATH} " PCC_EXECUTABLE)
156+ message (DEBUG "PCC resolved to: ${PCC_EXECUTABLE} " )
139157 string (JSON DEVICE_FLAG GET "${PCC_JSON} " "devices" ${DEV_INDEX} "pipeline_cache_device_flag" )
140158 string (JSON DEBUG_FLAG GET "${PCC_JSON} " "devices" ${DEV_INDEX} "pipeline_cache_debug_flag" )
141159
0 commit comments