diff --git a/renderdoc/driver/vulkan/vk_linux.cpp b/renderdoc/driver/vulkan/vk_linux.cpp index edaefe3f7..971de1539 100644 --- a/renderdoc/driver/vulkan/vk_linux.cpp +++ b/renderdoc/driver/vulkan/vk_linux.cpp @@ -228,18 +228,37 @@ static std::string GetSOFromJSON(const std::string &json) return ret; } -enum +enum class LayerPath : int { - USR, - ETC, - HOME, - COUNT + usr, + First = usr, + etc, + home, + Count, }; -string layerRegistrationPath[COUNT] = { - "/usr/share/vulkan/implicit_layer.d/renderdoc_capture.json", - "/etc/vulkan/implicit_layer.d/renderdoc_capture.json", - string(getenv("HOME")) + "/.local/share/vulkan/implicit_layer.d/renderdoc_capture.json"}; +ITERABLE_OPERATORS(LayerPath); + +string LayerRegistrationPath(LayerPath path) +{ + switch(path) + { + case LayerPath::usr: return "/usr/share/vulkan/implicit_layer.d/renderdoc_capture.json"; + case LayerPath::etc: return "/etc/vulkan/implicit_layer.d/renderdoc_capture.json"; + case LayerPath::home: + { + const char *xdg = getenv("XDG_DATA_HOME"); + if(xdg && FileIO::exists(xdg)) + return string(xdg) + "/vulkan/implicit_layer.d/renderdoc_capture.json"; + + return string(getenv("HOME")) + + "/.local/share/vulkan/implicit_layer.d/renderdoc_capture.json"; + } + default: break; + } + + return ""; +} string GetThisLibPath() { @@ -374,21 +393,21 @@ bool VulkanReplay::CheckVulkanLayer(VulkanLayerFlags &flags, std::vector()]; + bool match[arraydim()]; int numExist = 0; int numMatch = 0; - for(int i = 0; i < COUNT; i++) + for(LayerPath i : values()) { - exist[i] = FileExists(layerRegistrationPath[i]); - match[i] = (GetSOFromJSON(layerRegistrationPath[i]) == librenderdoc_path); + exist[(int)i] = FileExists(LayerRegistrationPath(i)); + match[(int)i] = (GetSOFromJSON(LayerRegistrationPath(i)) == librenderdoc_path); - if(exist[i]) + if(exist[(int)i]) numExist++; - if(match[i]) + if(match[(int)i]) numMatch++; } @@ -401,33 +420,33 @@ bool VulkanReplay::CheckVulkanLayer(VulkanLayerFlags &flags, std::vector