Commit 9385eb35 by Le Hoang Quyen Committed by Commit Bot

Metal: Generate default shaders to separate files.

Generate default shaders' OS specific versions to separate files to avoid mtl_default_shaders_autogen.inc becoming too big. Bug: angleproject:2634 Change-Id: Ie2a39971ec46c36ce13bf5cb72f998f2cbc0ab64 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2332145 Commit-Queue: Le Hoang Quyen <le.hoang.q@gmail.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarJonah Ryan-Davis <jonahr@google.com>
parent de914d01
......@@ -5,12 +5,24 @@
"1c231afc6100433a79fce49046aa5965",
"src/libANGLE/renderer/metal/shaders/common.h":
"7f4fe9c0ee3fa9bee84ea6627df44e04",
"src/libANGLE/renderer/metal/shaders/compiled/compiled_default_metallib_debug_ios_autogen.inc":
"10478c8a544f5a79decd6707d7c222e1",
"src/libANGLE/renderer/metal/shaders/compiled/compiled_default_metallib_debug_ios_sim_autogen.inc":
"781104f2c328281b8e12509bf24e2e3a",
"src/libANGLE/renderer/metal/shaders/compiled/compiled_default_metallib_debug_mac_autogen.inc":
"e3c377c317b4219623068780b03441cd",
"src/libANGLE/renderer/metal/shaders/compiled/compiled_default_metallib_ios_autogen.inc":
"1fc59139de5353ac94a58f2dfe70d1e7",
"src/libANGLE/renderer/metal/shaders/compiled/compiled_default_metallib_ios_sim_autogen.inc":
"32d664590f0a28063ea9e04d54126216",
"src/libANGLE/renderer/metal/shaders/compiled/compiled_default_metallib_mac_autogen.inc":
"1bdfb6157311f1e462d2d11b7868fd57",
"src/libANGLE/renderer/metal/shaders/compiled/mtl_default_shaders_autogen.inc":
"e244973f2fada4861373fbbf36be5d33",
"1614e50c13ceab6e72a5bc2c2dc32056",
"src/libANGLE/renderer/metal/shaders/constants.h":
"9bb6e63bf2b48a7a56978c787bde4850",
"src/libANGLE/renderer/metal/shaders/gen_indices.metal":
"002511e2b980a7fca7e80cbda6a82712",
"src/libANGLE/renderer/metal/shaders/gen_mtl_internal_shaders.py":
"a17189e67fe112942926902691de1539"
"43375642abef54e634e4c803b53de7d0"
}
\ No newline at end of file
......@@ -54,6 +54,12 @@ _metal_backend_sources = [
"mtl_state_cache.mm",
"mtl_utils.h",
"mtl_utils.mm",
"shaders/compiled/compiled_default_metallib_debug_ios_autogen.inc",
"shaders/compiled/compiled_default_metallib_debug_ios_sim_autogen.inc",
"shaders/compiled/compiled_default_metallib_debug_mac_autogen.inc",
"shaders/compiled/compiled_default_metallib_ios_autogen.inc",
"shaders/compiled/compiled_default_metallib_ios_sim_autogen.inc",
"shaders/compiled/compiled_default_metallib_mac_autogen.inc",
"shaders/compiled/mtl_default_shaders_autogen.inc",
"shaders/constants.h",
]
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -22,7 +22,7 @@ template_header_boilerplate = """// GENERATED FILE - DO NOT EDIT.
"""
# Convert content of a file to byte array and store in a header file.
# Convert content of a file to byte array and append to a header file.
# variable_name: name of C++ variable that will hold the file content as byte array.
# filename: the file whose content will be converted to C++ byte array.
# dest_src_file: destination header file that will contain the byte array.
......@@ -43,104 +43,142 @@ def append_file_as_byte_array_string(variable_name, filename, dest_src_file):
string += " "
string += "\n};\n"
string += 'constexpr\nsize_t {0}_len = sizeof({0});\n'.format(variable_name)
with open(dest_src_file, "a") as out_file:
out_file.write(string)
# Convert content of a file to byte array and store in a header file.
# variable_name: name of C++ variable that will hold the file content as byte array.
# copyright_comments: copyright comments
# filename: the file whose content will be converted to C++ byte array.
# dest_src_file: destination header file that will contain the byte array.
def store_file_as_byte_array_string(variable_name, copyright_comments, filename, dest_src_file):
os.system("echo \"{0}\" > {1}".format(copyright_comments, dest_src_file))
append_file_as_byte_array_string(variable_name, filename, dest_src_file)
# Convert content of a metallib to byte array and store in a header file, then include this header in
# mtl_default_shaders_autogen.inc.
# variable_name: name of C++ variable that will hold the file content as byte array.
# copyright_comments: copyright comments
# filename: the metallib file whose content will be converted to C++ byte array.
def store_metallib_as_byte_array_and_include(variable_name, copyright_comments, filename):
array_autogen_filename = "{0}_autogen.inc".format(
filename.replace('.metallib', '').replace('.', '_'))
# Generate a header containing the file's content as C array.
store_file_as_byte_array_string(variable_name, copyright_comments, filename,
array_autogen_filename)
# Include this file in mtl_default_shaders_autogen.inc
# NOTE: filename already includes "compiled/"
include_code = '#include "{0}"\n'.format(array_autogen_filename.replace('compiled/', ''))
with open('compiled/mtl_default_shaders_autogen.inc', "a") as out_file:
out_file.write(include_code)
# Compile metal shader.
# mac_version: target version of macOS
# ios_version: target version of iOS
# variable_name: name of C++ variable that will hold the compiled binary data as a C array.
# additional_flags: additional shader compiler flags
# src_files: metal source files
def gen_precompiled_shaders(mac_version, ios_version, variable_name, additional_flags, src_files):
def gen_precompiled_shaders(mac_version, ios_version, variable_name, additional_flags, src_files,
copyright_comments):
print('Generating default shaders with flags=\'{0}\' ...'.format(additional_flags))
# Mac version's compilation
print('Compiling macos {0} version of default shaders ...'.format(mac_version))
mac_metallib = 'compiled/{0}.mac.metallib'.format(variable_name)
object_files = ''
for src_file in src_files:
object_file = 'compiled/default.{0}.{1}.air'.format(mac_version, src_file)
object_files += ' ' + object_file
os.system('xcrun -sdk macosx metal -mmacosx-version-min={0} {1} {2} -c -o {3}'.format(
mac_version, additional_flags, src_file, object_file))
os.system(
'xcrun -sdk macosx metallib {object_files} -o compiled/default.{mac_version}.metallib'
.format(mac_version=mac_version, object_files=object_files))
os.system('xcrun -sdk macosx metallib {object_files} -o {file}'.format(
file=mac_metallib, object_files=object_files))
# iOS device version's compilation
print('Compiling ios {0} version of default shaders ...'.format(ios_version))
ios_metallib = 'compiled/{0}.ios.metallib'.format(variable_name)
object_files = ''
for src_file in src_files:
object_file = 'compiled/default.ios.{0}.{1}.air'.format(ios_version, src_file)
object_files += ' ' + object_file
os.system('xcrun -sdk iphoneos metal -mios-version-min={0} {1} {2} -c -o {3}'.format(
ios_version, additional_flags, src_file, object_file))
os.system(
'xcrun -sdk iphoneos metallib {object_files} -o compiled/default.ios.{ios_version}.metallib'
.format(ios_version=ios_version, object_files=object_files))
os.system('xcrun -sdk iphoneos metallib {object_files} -o {file}'.format(
file=ios_metallib, object_files=object_files))
# iOS simulator version's compilation
print('Compiling ios {0} simulator version of default shaders ...'.format(ios_version))
object_files = ''
ios_sim_metallib = 'compiled/{0}.ios_sim.metallib'.format(variable_name)
object_files = ''
for src_file in src_files:
object_file = 'compiled/default.ios_sim.{0}.{1}.air'.format(ios_version, src_file)
object_files += ' ' + object_file
os.system('xcrun -sdk iphonesimulator metal {0} {1} -c -o {2}'.format(
additional_flags, src_file, object_file))
os.system(
'xcrun -sdk iphonesimulator metallib {object_files} -o compiled/default.ios_sim.{ios_version}.metallib'
.format(ios_version=ios_version, object_files=object_files))
os.system('xcrun -sdk iphonesimulator metallib {object_files} -o {file}'.format(
file=ios_sim_metallib, object_files=object_files))
# Mac version's byte array string
os.system(
'echo "#if TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >> compiled/mtl_default_shaders_autogen.inc'
)
append_file_as_byte_array_string(variable_name,
'compiled/default.{0}.metallib'.format(mac_version),
'compiled/mtl_default_shaders_autogen.inc')
os.system(
'echo "constexpr\nsize_t {0}_len = sizeof({0});" >> compiled/mtl_default_shaders_autogen.inc'
.format(variable_name))
store_metallib_as_byte_array_and_include(variable_name, copyright_comments, mac_metallib)
# iOS simulator version's byte array string
os.system(
'echo "\n#elif TARGET_OS_IOS && TARGET_OS_SIMULATOR // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >> compiled/mtl_default_shaders_autogen.inc'
)
append_file_as_byte_array_string(variable_name,
'compiled/default.ios_sim.{0}.metallib'.format(ios_version),
'compiled/mtl_default_shaders_autogen.inc')
os.system(
'echo "constexpr\nsize_t {0}_len = sizeof({0});" >> compiled/mtl_default_shaders_autogen.inc'
.format(variable_name))
store_metallib_as_byte_array_and_include(variable_name, copyright_comments, ios_sim_metallib)
# iOS version's byte array string
os.system(
'echo "\n#elif TARGET_OS_IOS // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >> compiled/mtl_default_shaders_autogen.inc'
)
append_file_as_byte_array_string(variable_name,
'compiled/default.ios.{0}.metallib'.format(ios_version),
'compiled/mtl_default_shaders_autogen.inc')
os.system(
'echo "constexpr\nsize_t {0}_len = sizeof({0});" >> compiled/mtl_default_shaders_autogen.inc'
.format(variable_name))
store_metallib_as_byte_array_and_include(variable_name, copyright_comments, ios_metallib)
os.system(
'echo "#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >> compiled/mtl_default_shaders_autogen.inc'
)
os.system('rm -rfv compiled/default.*')
os.system('rm -rfv compiled/*.air')
os.system('rm -rfv compiled/*.metallib')
def main():
src_files = ['blit.metal', 'clear.metal', 'gen_indices.metal']
# yapf: disable
os_specific_autogen_files = [
'compiled/compiled_default_metallib_debug_ios_autogen.inc',
'compiled/compiled_default_metallib_debug_ios_sim_autogen.inc',
'compiled/compiled_default_metallib_debug_mac_autogen.inc',
'compiled/compiled_default_metallib_ios_autogen.inc',
'compiled/compiled_default_metallib_ios_sim_autogen.inc',
'compiled/compiled_default_metallib_mac_autogen.inc',
]
# yapf: enable
# auto_script parameters.
if len(sys.argv) > 1:
inputs = src_files + ['common.h', 'constants.h']
outputs = ['compiled/mtl_default_shaders_autogen.inc']
outputs = ['compiled/mtl_default_shaders_autogen.inc'] + os_specific_autogen_files
if sys.argv[1] == 'inputs':
print ','.join(inputs)
......@@ -168,9 +206,10 @@ def main():
os.system('echo "// clang-format off" >> compiled/mtl_default_shaders_autogen.inc')
# pre-compiled shaders
gen_precompiled_shaders(10.13, 11.0, 'compiled_default_metallib', '', src_files)
gen_precompiled_shaders(10.13, 11.0, 'compiled_default_metallib', '', src_files,
boilerplate_code)
gen_precompiled_shaders(10.13, 11.0, 'compiled_default_metallib_debug',
'-gline-tables-only -MO', src_files)
'-gline-tables-only -MO', src_files, boilerplate_code)
os.system('echo "// clang-format on" >> compiled/mtl_default_shaders_autogen.inc')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment