xref: /aosp_15_r20/external/skia/gn/minify_sksl.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python
2*c8dee2aaSAndroid Build Coastguard Worker#
3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2020 Google LLC
4*c8dee2aaSAndroid Build Coastguard Worker#
5*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
6*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file.
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Workerimport os
9*c8dee2aaSAndroid Build Coastguard Workerimport subprocess
10*c8dee2aaSAndroid Build Coastguard Workerimport sys
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Workersksl_minify = sys.argv[1]
13*c8dee2aaSAndroid Build Coastguard WorkertargetDir = sys.argv[2]
14*c8dee2aaSAndroid Build Coastguard Workermodules = sys.argv[3:]
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker# sksl-minify uses the dependency list to ensure that minified names are unique at global scope.
17*c8dee2aaSAndroid Build Coastguard Workerdependencies = {
18*c8dee2aaSAndroid Build Coastguard Worker    'sksl_compute': ['sksl_gpu', 'sksl_shared'],
19*c8dee2aaSAndroid Build Coastguard Worker    'sksl_gpu': ['sksl_shared'],
20*c8dee2aaSAndroid Build Coastguard Worker    'sksl_frag': ['sksl_gpu', 'sksl_shared'],
21*c8dee2aaSAndroid Build Coastguard Worker    'sksl_vert': ['sksl_gpu', 'sksl_shared'],
22*c8dee2aaSAndroid Build Coastguard Worker    'sksl_graphite_frag': ['sksl_frag', 'sksl_gpu', 'sksl_shared'],
23*c8dee2aaSAndroid Build Coastguard Worker    'sksl_graphite_frag_es2': ['sksl_frag', 'sksl_gpu', 'sksl_shared'],
24*c8dee2aaSAndroid Build Coastguard Worker    'sksl_graphite_vert': ['sksl_vert', 'sksl_gpu', 'sksl_shared'],
25*c8dee2aaSAndroid Build Coastguard Worker    'sksl_graphite_vert_es2': ['sksl_vert', 'sksl_gpu', 'sksl_shared'],
26*c8dee2aaSAndroid Build Coastguard Worker    'sksl_public': ['sksl_shared'],
27*c8dee2aaSAndroid Build Coastguard Worker    'sksl_rt_shader': ['sksl_public', 'sksl_shared'],
28*c8dee2aaSAndroid Build Coastguard Worker    'sksl_shared': [],
29*c8dee2aaSAndroid Build Coastguard Worker}
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Workerfor module in modules:
32*c8dee2aaSAndroid Build Coastguard Worker    try:
33*c8dee2aaSAndroid Build Coastguard Worker        moduleDir, moduleName = os.path.split(os.path.splitext(module)[0])
34*c8dee2aaSAndroid Build Coastguard Worker        if not os.path.isdir(targetDir):
35*c8dee2aaSAndroid Build Coastguard Worker            os.mkdir(targetDir)
36*c8dee2aaSAndroid Build Coastguard Worker        target = os.path.join(targetDir, moduleName)
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker        # Determine the program kind based on the module name.
39*c8dee2aaSAndroid Build Coastguard Worker        if "_compute" in module:
40*c8dee2aaSAndroid Build Coastguard Worker            programKind = "--compute"
41*c8dee2aaSAndroid Build Coastguard Worker        elif "_vert" in module:
42*c8dee2aaSAndroid Build Coastguard Worker            programKind = "--vert"
43*c8dee2aaSAndroid Build Coastguard Worker        else:
44*c8dee2aaSAndroid Build Coastguard Worker            programKind = "--frag"
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker        # Assemble the module dependency list and call sksl-minify to recreate the module in its
47*c8dee2aaSAndroid Build Coastguard Worker        # minified form.
48*c8dee2aaSAndroid Build Coastguard Worker        moduleList = [module]
49*c8dee2aaSAndroid Build Coastguard Worker        if moduleName not in dependencies:
50*c8dee2aaSAndroid Build Coastguard Worker            print("### Error compiling " + moduleName + ": dependency list must be specified")
51*c8dee2aaSAndroid Build Coastguard Worker            exit(1)
52*c8dee2aaSAndroid Build Coastguard Worker        for dependent in dependencies[moduleName]:
53*c8dee2aaSAndroid Build Coastguard Worker            moduleList.append(os.path.join(moduleDir, dependent) + ".sksl")
54*c8dee2aaSAndroid Build Coastguard Worker
55*c8dee2aaSAndroid Build Coastguard Worker        # Generate fully-optimized and minified module data (for release/optimize-for-size builds).
56*c8dee2aaSAndroid Build Coastguard Worker        destPath = target + ".minified.sksl"
57*c8dee2aaSAndroid Build Coastguard Worker        args = [sksl_minify, programKind, "--stringify", destPath] + moduleList
58*c8dee2aaSAndroid Build Coastguard Worker        subprocess.check_output(args).decode('utf-8')
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker        # Generate unoptimized module data (used in debug, for improved readability).
61*c8dee2aaSAndroid Build Coastguard Worker        destPath = target + ".unoptimized.sksl"
62*c8dee2aaSAndroid Build Coastguard Worker        args = [sksl_minify, programKind, "--unoptimized", "--stringify", destPath] + moduleList
63*c8dee2aaSAndroid Build Coastguard Worker        subprocess.check_output(args).decode('utf-8')
64*c8dee2aaSAndroid Build Coastguard Worker
65*c8dee2aaSAndroid Build Coastguard Worker    except subprocess.CalledProcessError as err:
66*c8dee2aaSAndroid Build Coastguard Worker        print("### Error compiling " + module + ":")
67*c8dee2aaSAndroid Build Coastguard Worker        print(err.output)
68*c8dee2aaSAndroid Build Coastguard Worker        exit(1)
69