Skip to content

Instantly share code, notes, and snippets.

@cheery
Created February 19, 2016 23:27
Show Gist options
  • Save cheery/88912b89cac21ab25abd to your computer and use it in GitHub Desktop.
Save cheery/88912b89cac21ab25abd to your computer and use it in GitHub Desktop.
Run scripts with added vulkan layers
#!/usr/bin/env python
"""
Run programs with added vulkan layers.
Author: Henri Tuhola <henri.tuhola@gmail.com>
License: MIT
Date: 2016-2-20
"""
import argparse, json, os, sys
parser = argparse.ArgumentParser(description="Run programs with added vulkan layers")
parser.add_argument("names", metavar="NAME", nargs='*',
help="Appropos for the vulkan layer to add")
parser.add_argument("-c", dest="cmd", metavar="COMMAND", nargs='+',
help="Command to execute")
parser.add_argument("-l", "--list", dest="ls", action="store_true",
help="List available layers")
args = parser.parse_args()
instance_layers = os.environ.get("VK_INSTANCE_LAYERS", "").split(":")
device_layers = os.environ.get("VK_DEVICE_LAYERS", "").split(":")
instance_layers = filter(bool, instance_layers)
device_layers = filter(bool, device_layers)
paths = [
"/usr/share/vulkan/implicit_layer.d",
"/usr/share/vulkan/explicit_layer.d",
"/etc/vulkan/implicit_layer.d",
"/etc/vulkan/explicit_layer.d",
]
manifests = []
for path in paths:
try:
manifests.extend(os.path.join(path, name)
for name in os.listdir(path)
if name.endswith(".json"))
except OSError as _:
pass
layers = []
for path in manifests:
with open(path) as fd:
manifest = json.load(fd)
layers.append( manifest["layer"]["name"] )
# I did not find the alias layers defined anywhere. So here it is.
aliases = {
"VK_LAYER_LUNARG_standard_validation": [
"VK_LAYER_LUNARG_threading",
"VK_LAYER_LUNARG_param_checker",
"VK_LAYER_LUNARG_device_limits",
"VK_LAYER_LUNARG_object_tracker",
"VK_LAYER_LUNARG_image",
"VK_LAYER_LUNARG_mem_tracker",
"VK_LAYER_LUNARG_draw_state",
"VK_LAYER_LUNARG_swapchain",
"VK_LAYER_GOOGLE_unique_objects",
]
}
layers.extend(aliases)
for arg in args.names:
for name in layers:
if name.find(arg) >= 0:
instance_layers.append(name)
device_layers.append(name)
if args.ls:
for name in sorted(layers):
active = "[ ]"
if name in instance_layers and name in device_layers:
active = "[*]"
elif name in instance_layers:
active = "[I]"
elif name in device_layers:
active = "[D]"
sys.stdout.write("{:<40}{}\n".format(name, active))
elif not args.cmd:
sys.stdout.write("\n ".join(["VK_INSTANCE_LAYERS="] + instance_layers) + "\n")
sys.stdout.write("\n ".join(["VK_DEVICE_LAYERS="] + device_layers) + "\n")
if args.cmd:
os.environ["VK_INSTANCE_LAYERS"] = ":".join(instance_layers)
os.environ["VK_DEVICE_LAYERS"] = ":".join(device_layers)
os.execvp(args.cmd[0], args.cmd)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment