132 lines
3.7 KiB
Python
132 lines
3.7 KiB
Python
|
#!/usr/bin/env python3
|
||
|
# Copyright 2022 The Dawn 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
|
||
|
#
|
||
|
# http://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.
|
||
|
|
||
|
import json, os, sys
|
||
|
from collections import namedtuple
|
||
|
|
||
|
from generator_lib import Generator, run_generator, FileRender
|
||
|
|
||
|
|
||
|
class Name:
|
||
|
def __init__(self, name):
|
||
|
self.name = name
|
||
|
self.chunks = name.split(' ')
|
||
|
|
||
|
def get(self):
|
||
|
return self.name
|
||
|
|
||
|
def CamelChunk(self, chunk):
|
||
|
return chunk[0].upper() + chunk[1:]
|
||
|
|
||
|
def canonical_case(self):
|
||
|
return (' '.join(self.chunks)).lower()
|
||
|
|
||
|
def concatcase(self):
|
||
|
return ''.join(self.chunks)
|
||
|
|
||
|
def camelCase(self):
|
||
|
return self.chunks[0] + ''.join(
|
||
|
[self.CamelChunk(chunk) for chunk in self.chunks[1:]])
|
||
|
|
||
|
def CamelCase(self):
|
||
|
return ''.join([self.CamelChunk(chunk) for chunk in self.chunks])
|
||
|
|
||
|
def SNAKE_CASE(self):
|
||
|
return '_'.join([chunk.upper() for chunk in self.chunks])
|
||
|
|
||
|
def snake_case(self):
|
||
|
return '_'.join(self.chunks)
|
||
|
|
||
|
def js_enum_case(self):
|
||
|
result = self.chunks[0].lower()
|
||
|
for chunk in self.chunks[1:]:
|
||
|
if not result[-1].isdigit():
|
||
|
result += '-'
|
||
|
result += chunk.lower()
|
||
|
return result
|
||
|
|
||
|
|
||
|
class Architecture:
|
||
|
def __init__(self, name, json_data):
|
||
|
self.name = Name(name)
|
||
|
self.devices = []
|
||
|
for device in json_data:
|
||
|
self.devices.append(device)
|
||
|
|
||
|
|
||
|
class Vendor:
|
||
|
def __init__(self, name, json_data):
|
||
|
self.name = Name(name)
|
||
|
self.id = json_data['id']
|
||
|
|
||
|
self.deviceMask = None
|
||
|
if 'deviceMask' in json_data:
|
||
|
self.deviceMask = json_data['deviceMask']
|
||
|
|
||
|
self.architectures = []
|
||
|
|
||
|
if 'architecture' in json_data:
|
||
|
for (arch_name, arch_data) in json_data['architecture'].items():
|
||
|
# Skip any entries that start with an underscore. Used for comments.
|
||
|
if arch_name[0] == '_':
|
||
|
continue
|
||
|
|
||
|
self.architectures.append(Architecture(arch_name, arch_data))
|
||
|
|
||
|
def maskDeviceId(self):
|
||
|
if not self.deviceMask:
|
||
|
return ''
|
||
|
return ' & ' + self.deviceMask
|
||
|
|
||
|
|
||
|
def parse_json(json):
|
||
|
vendors = []
|
||
|
|
||
|
for (vendor, vendor_data) in json['vendors'].items():
|
||
|
vendors.append(Vendor(vendor, vendor_data))
|
||
|
|
||
|
return {'vendors': vendors}
|
||
|
|
||
|
|
||
|
class DawnGpuInfoGenerator(Generator):
|
||
|
def get_description(self):
|
||
|
return "Generates GPU Info Dawn code."
|
||
|
|
||
|
def add_commandline_arguments(self, parser):
|
||
|
parser.add_argument('--gpu-info-json',
|
||
|
required=True,
|
||
|
type=str,
|
||
|
help='The GPU Info JSON definition to use.')
|
||
|
|
||
|
def get_dependencies(self, args):
|
||
|
return [os.path.abspath(args.gpu_info_json)]
|
||
|
|
||
|
def get_file_renders(self, args):
|
||
|
with open(args.gpu_info_json) as f:
|
||
|
loaded_json = json.loads(f.read())
|
||
|
|
||
|
params = parse_json(loaded_json)
|
||
|
|
||
|
return [
|
||
|
FileRender("dawn/common/GPUInfo.h",
|
||
|
"src/dawn/common/GPUInfo_autogen.h", [params]),
|
||
|
FileRender("dawn/common/GPUInfo.cpp",
|
||
|
"src/dawn/common/GPUInfo_autogen.cpp", [params]),
|
||
|
]
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
sys.exit(run_generator(DawnGpuInfoGenerator()))
|