1#!/usr/bin/python 2# Copyright 2019 The ANGLE Project Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5# 6# gen_mtl_internal_shaders.py: 7# Code generation for Metal backend's default shaders. 8# NOTE: don't run this script directly. Run scripts/run_code_generation.py. 9 10import os 11import sys 12import json 13from datetime import datetime 14 15template_header_boilerplate = """// GENERATED FILE - DO NOT EDIT. 16// Generated by {script_name} 17// 18// Copyright {copyright_year} The ANGLE Project Authors. All rights reserved. 19// Use of this source code is governed by a BSD-style license that can be 20// found in the LICENSE file. 21// 22""" 23 24 25def main(): 26 # auto_script parameters. 27 if len(sys.argv) > 1: 28 inputs = [ 29 'master_source.metal', 'blit.metal', 'clear.metal', 'gen_indices.metal', 'common.h' 30 ] 31 outputs = ['compiled/mtl_default_shaders.inc', 'mtl_default_shaders_src_autogen.inc'] 32 33 if sys.argv[1] == 'inputs': 34 print ','.join(inputs) 35 elif sys.argv[1] == 'outputs': 36 print ','.join(outputs) 37 else: 38 print('Invalid script parameters') 39 return 1 40 return 0 41 42 os.chdir(sys.path[0]) 43 44 print('Compiling macos version of default shaders ...') 45 os.system( 46 'xcrun -sdk macosx metal master_source.metal -mmacosx-version-min=10.13 -c -o compiled/default.air' 47 ) 48 os.system('xcrun -sdk macosx metallib compiled/default.air -o compiled/default.metallib') 49 50 print('Compiling ios version of default shaders ...') 51 os.system( 52 'xcrun -sdk iphoneos metal master_source.metal -mios-version-min=11.0 -c -o compiled/default.ios.air' 53 ) 54 os.system( 55 'xcrun -sdk iphoneos metallib compiled/default.ios.air -o compiled/default.ios.metallib') 56 57 print('Compiling ios simulator version of default shaders ...') 58 os.system( 59 'xcrun -sdk iphonesimulator metal master_source.metal -c -o compiled/default.ios_sim.air') 60 os.system( 61 'xcrun -sdk iphonesimulator metallib compiled/default.ios_sim.air -o compiled/default.ios_sim.metallib' 62 ) 63 64 boilerplate_code = template_header_boilerplate.format( 65 script_name=sys.argv[0], copyright_year=datetime.today().year) 66 67 os.system("echo \"{0}\" > compiled/mtl_default_shaders.inc".format(boilerplate_code)) 68 os.system( 69 'echo "// Compiled binary for Metal default shaders.\n\n" >> compiled/mtl_default_shaders.inc' 70 ) 71 os.system('echo "#include <TargetConditionals.h>\n\n" >> compiled/mtl_default_shaders.inc') 72 73 # Mac version 74 os.system( 75 'echo "#if TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >> compiled/mtl_default_shaders.inc') 76 77 os.system('echo "constexpr" >> compiled/mtl_default_shaders.inc') 78 os.system('xxd -i compiled/default.metallib >> compiled/mtl_default_shaders.inc') 79 80 # iOS simulator version 81 os.system( 82 'echo "\n#elif TARGET_OS_SIMULATOR // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >> compiled/mtl_default_shaders.inc' 83 ) 84 85 os.system( 86 'echo "#define compiled_default_metallib compiled_default_ios_sim_metallib" >> compiled/mtl_default_shaders.inc' 87 ) 88 os.system( 89 'echo "#define compiled_default_metallib_len compiled_default_ios_sim_metallib_len\n" >> compiled/mtl_default_shaders.inc' 90 ) 91 os.system('echo "constexpr" >> compiled/mtl_default_shaders.inc') 92 os.system('xxd -i compiled/default.ios_sim.metallib >> compiled/mtl_default_shaders.inc') 93 94 # iOS version 95 os.system( 96 'echo "\n#elif TARGET_OS_IOS // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >> compiled/mtl_default_shaders.inc' 97 ) 98 99 os.system( 100 'echo "#define compiled_default_metallib compiled_default_ios_metallib" >> compiled/mtl_default_shaders.inc' 101 ) 102 os.system( 103 'echo "#define compiled_default_metallib_len compiled_default_ios_metallib_len\n" >> compiled/mtl_default_shaders.inc' 104 ) 105 os.system('echo "constexpr" >> compiled/mtl_default_shaders.inc') 106 os.system('xxd -i compiled/default.ios.metallib >> compiled/mtl_default_shaders.inc') 107 108 os.system( 109 'echo "#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >> compiled/mtl_default_shaders.inc' 110 ) 111 112 # Write full source string for debug purpose 113 os.system("echo \"{0}\" > mtl_default_shaders_src_autogen.inc".format(boilerplate_code)) 114 os.system( 115 'echo "// C++ string version of Metal default shaders for debug purpose.\n\n" >> mtl_default_shaders_src_autogen.inc' 116 ) 117 os.system( 118 'echo "\n\nconstexpr char default_metallib_src[] = R\\"(" >> mtl_default_shaders_src_autogen.inc' 119 ) 120 os.system('echo "#include <metal_stdlib>" >> mtl_default_shaders_src_autogen.inc') 121 os.system('echo "#include <simd/simd.h>" >> mtl_default_shaders_src_autogen.inc') 122 os.system( 123 'clang -xc++ -E -DSKIP_STD_HEADERS master_source.metal >> mtl_default_shaders_src_autogen.inc' 124 ) 125 os.system('echo ")\\";" >> mtl_default_shaders_src_autogen.inc') 126 127 128if __name__ == '__main__': 129 sys.exit(main()) 130