You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.6 KiB
127 lines
4.6 KiB
4 months ago
|
#!/usr/bin/env python
|
||
|
|
||
|
# Copyright (C) 2016 The ANGLE Project Authors.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
"""Generate copies of the Vulkan layers JSON files, with no paths, forcing
|
||
|
Vulkan to use the default search path to look for layers."""
|
||
|
|
||
|
from __future__ import print_function
|
||
|
|
||
|
import argparse
|
||
|
import glob
|
||
|
import json
|
||
|
import os
|
||
|
import platform
|
||
|
import sys
|
||
|
|
||
|
|
||
|
def glob_slash(dirname):
|
||
|
"""Like regular glob but replaces \ with / in returned paths."""
|
||
|
return [s.replace('\\', '/') for s in glob.glob(dirname)]
|
||
|
|
||
|
|
||
|
def main():
|
||
|
parser = argparse.ArgumentParser(description=__doc__)
|
||
|
parser.add_argument('--icd', action='store_true')
|
||
|
parser.add_argument('source_dir')
|
||
|
parser.add_argument('target_dir')
|
||
|
parser.add_argument('version_header', help='path to vulkan_core.h')
|
||
|
parser.add_argument('json_files', nargs='*')
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
source_dir = args.source_dir
|
||
|
target_dir = args.target_dir
|
||
|
|
||
|
json_files = [j for j in args.json_files if j.endswith('.json')]
|
||
|
json_in_files = [j for j in args.json_files if j.endswith('.json.in')]
|
||
|
|
||
|
data_key = 'ICD' if args.icd else 'layer'
|
||
|
|
||
|
if not os.path.isdir(source_dir):
|
||
|
print(source_dir + ' is not a directory.', file=sys.stderr)
|
||
|
return 1
|
||
|
|
||
|
if not os.path.exists(target_dir):
|
||
|
os.makedirs(target_dir)
|
||
|
|
||
|
# Copy the *.json files from source dir to target dir
|
||
|
if (set(glob_slash(os.path.join(source_dir, '*.json'))) != set(json_files)):
|
||
|
print(glob.glob(os.path.join(source_dir, '*.json')))
|
||
|
print('.json list in gn file is out-of-date', file=sys.stderr)
|
||
|
return 1
|
||
|
|
||
|
for json_fname in json_files:
|
||
|
if not json_fname.endswith('.json'):
|
||
|
continue
|
||
|
with open(json_fname) as infile:
|
||
|
data = json.load(infile)
|
||
|
|
||
|
# Update the path.
|
||
|
if not data_key in data:
|
||
|
raise Exception(
|
||
|
"Could not find '%s' key in %s" % (data_key, json_fname))
|
||
|
|
||
|
# The standard validation layer has no library path.
|
||
|
if 'library_path' in data[data_key]:
|
||
|
prev_name = os.path.basename(data[data_key]['library_path'])
|
||
|
data[data_key]['library_path'] = prev_name
|
||
|
|
||
|
target_fname = os.path.join(target_dir, os.path.basename(json_fname))
|
||
|
with open(target_fname, 'wb') as outfile:
|
||
|
json.dump(data, outfile)
|
||
|
|
||
|
# Get the Vulkan version from the vulkan_core.h file
|
||
|
vk_header_filename = args.version_header
|
||
|
vk_version = None
|
||
|
with open(vk_header_filename) as vk_header_file:
|
||
|
for line in vk_header_file:
|
||
|
if line.startswith('#define VK_HEADER_VERSION'):
|
||
|
vk_version = line.split()[-1]
|
||
|
break
|
||
|
if not vk_version:
|
||
|
print('failed to extract vk_version', file=sys.stderr)
|
||
|
return 1
|
||
|
|
||
|
# Set json file prefix and suffix for generating files, default to Linux.
|
||
|
relative_path_prefix = '../lib'
|
||
|
file_type_suffix = '.so'
|
||
|
if platform.system() == 'Windows':
|
||
|
relative_path_prefix = r'..\\' # json-escaped, hence two backslashes.
|
||
|
file_type_suffix = '.dll'
|
||
|
|
||
|
# For each *.json.in template files in source dir generate actual json file
|
||
|
# in target dir
|
||
|
if (set(glob_slash(os.path.join(source_dir, '*.json.in'))) !=
|
||
|
set(json_in_files)):
|
||
|
print('.json.in list in gn file is out-of-date', file=sys.stderr)
|
||
|
return 1
|
||
|
for json_in_name in json_in_files:
|
||
|
if not json_in_name.endswith('.json.in'):
|
||
|
continue
|
||
|
json_in_fname = os.path.basename(json_in_name)
|
||
|
layer_name = json_in_fname[:-len('.json.in')]
|
||
|
layer_lib_name = layer_name + file_type_suffix
|
||
|
json_out_fname = os.path.join(target_dir, json_in_fname[:-len('.in')])
|
||
|
with open(json_out_fname,'w') as json_out_file, \
|
||
|
open(json_in_name) as infile:
|
||
|
for line in infile:
|
||
|
line = line.replace('@RELATIVE_LAYER_BINARY@',
|
||
|
relative_path_prefix + layer_lib_name)
|
||
|
line = line.replace('@VK_VERSION@', '1.1.' + vk_version)
|
||
|
json_out_file.write(line)
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
sys.exit(main())
|