xref: /aosp_15_r20/external/skia/gn/minify_sksl_tests.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python
2*c8dee2aaSAndroid Build Coastguard Worker#
3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2022 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 shlex
10*c8dee2aaSAndroid Build Coastguard Workerimport subprocess
11*c8dee2aaSAndroid Build Coastguard Workerimport sys
12*c8dee2aaSAndroid Build Coastguard Workerimport tempfile
13*c8dee2aaSAndroid Build Coastguard Worker
14*c8dee2aaSAndroid Build Coastguard WorkerbatchMinify = False
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Workersksl_minify = sys.argv[1]
17*c8dee2aaSAndroid Build Coastguard Workershared_module = sys.argv[2]
18*c8dee2aaSAndroid Build Coastguard Workerpublic_module = sys.argv[3]
19*c8dee2aaSAndroid Build Coastguard Workerrt_shader_module = sys.argv[4]
20*c8dee2aaSAndroid Build Coastguard Workerinput_root_dir = sys.argv[5]
21*c8dee2aaSAndroid Build Coastguard Workeroutput_root_dir = sys.argv[6]
22*c8dee2aaSAndroid Build Coastguard Worker# The last arg is a file containing a space seperated list of filenames
23*c8dee2aaSAndroid Build Coastguard Workerinput_file = sys.argv[7]
24*c8dee2aaSAndroid Build Coastguard Workerwith open(input_file, 'r') as reader:
25*c8dee2aaSAndroid Build Coastguard Worker    all_inputs = shlex.split(reader.read())
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Workerinputs = []
28*c8dee2aaSAndroid Build Coastguard Workerfor file in all_inputs:
29*c8dee2aaSAndroid Build Coastguard Worker    if (file.endswith(".rts") or file.endswith(".privrts") or file.endswith(".rtcf") or
30*c8dee2aaSAndroid Build Coastguard Worker        file.endswith(".rtb") or file.endswith(".mfrag") or file.endswith(".mvert")):
31*c8dee2aaSAndroid Build Coastguard Worker        inputs.append(file)
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Workerdef executeWorklist(input, worklist):
34*c8dee2aaSAndroid Build Coastguard Worker    # Invoke sksl-minify, passing in the worklist.
35*c8dee2aaSAndroid Build Coastguard Worker    worklist.close()
36*c8dee2aaSAndroid Build Coastguard Worker    try:
37*c8dee2aaSAndroid Build Coastguard Worker        output = subprocess.check_output([
38*c8dee2aaSAndroid Build Coastguard Worker            sksl_minify, worklist.name], stderr=subprocess.STDOUT).decode('utf-8', errors='ignore')
39*c8dee2aaSAndroid Build Coastguard Worker    except subprocess.CalledProcessError as err:
40*c8dee2aaSAndroid Build Coastguard Worker        if err.returncode != 1:
41*c8dee2aaSAndroid Build Coastguard Worker            print("### " + input + " sksl-minify error:\n")
42*c8dee2aaSAndroid Build Coastguard Worker            print("\n".join(err.output.decode('utf-8', errors='ignore').splitlines()))
43*c8dee2aaSAndroid Build Coastguard Worker            sys.exit(err.returncode)
44*c8dee2aaSAndroid Build Coastguard Worker        pass  # Compile errors (exit code 1) are expected and normal in test code
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker    # Delete the worklist file now that execution is complete.
47*c8dee2aaSAndroid Build Coastguard Worker    os.remove(worklist.name)
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Workerworklist = tempfile.NamedTemporaryFile(suffix='.worklist', delete=False, mode='w')
50*c8dee2aaSAndroid Build Coastguard Worker
51*c8dee2aaSAndroid Build Coastguard Worker# Here we loop over the inputs and convert them into a worklist file for sksl-minify.
52*c8dee2aaSAndroid Build Coastguard Workerfor input in inputs:
53*c8dee2aaSAndroid Build Coastguard Worker    # Derive the target path from the input filename and remove the extension so it can
54*c8dee2aaSAndroid Build Coastguard Worker    # end with .minified.sksl
55*c8dee2aaSAndroid Build Coastguard Worker    target = input.replace(input_root_dir, output_root_dir)
56*c8dee2aaSAndroid Build Coastguard Worker    target = os.path.splitext(target)[0]
57*c8dee2aaSAndroid Build Coastguard Worker    target_dir = os.path.dirname(target)
58*c8dee2aaSAndroid Build Coastguard Worker    if not os.path.isdir(target_dir):
59*c8dee2aaSAndroid Build Coastguard Worker        os.mkdir(target_dir)
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker    noExt, ext = os.path.splitext(input)
62*c8dee2aaSAndroid Build Coastguard Worker    head, tail = os.path.split(noExt)
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker    if ext == '.rts':
65*c8dee2aaSAndroid Build Coastguard Worker        worklist.write("--shader\n")
66*c8dee2aaSAndroid Build Coastguard Worker    elif ext == '.privrts':
67*c8dee2aaSAndroid Build Coastguard Worker        worklist.write("--privshader\n")
68*c8dee2aaSAndroid Build Coastguard Worker    elif ext == '.rtcf':
69*c8dee2aaSAndroid Build Coastguard Worker        worklist.write("--colorfilter\n")
70*c8dee2aaSAndroid Build Coastguard Worker    elif ext == '.rtb':
71*c8dee2aaSAndroid Build Coastguard Worker        worklist.write("--blender\n")
72*c8dee2aaSAndroid Build Coastguard Worker    elif ext == '.mfrag':
73*c8dee2aaSAndroid Build Coastguard Worker        worklist.write("--meshfrag\n")
74*c8dee2aaSAndroid Build Coastguard Worker    elif ext == '.mvert':
75*c8dee2aaSAndroid Build Coastguard Worker        worklist.write("--meshvert\n")
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker    worklist.write(target + ".minified.sksl\n")
78*c8dee2aaSAndroid Build Coastguard Worker    worklist.write(input + "\n")
79*c8dee2aaSAndroid Build Coastguard Worker    if ext == '.privrts':
80*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(rt_shader_module + "\n")
81*c8dee2aaSAndroid Build Coastguard Worker    worklist.write(public_module + "\n")
82*c8dee2aaSAndroid Build Coastguard Worker    worklist.write(shared_module + "\n\n")
83*c8dee2aaSAndroid Build Coastguard Worker
84*c8dee2aaSAndroid Build Coastguard Worker    # Compile items one at a time.
85*c8dee2aaSAndroid Build Coastguard Worker    if not batchMinify:
86*c8dee2aaSAndroid Build Coastguard Worker        executeWorklist(input, worklist)
87*c8dee2aaSAndroid Build Coastguard Worker        worklist = tempfile.NamedTemporaryFile(suffix='.worklist', delete=False, mode='w')
88*c8dee2aaSAndroid Build Coastguard Worker
89*c8dee2aaSAndroid Build Coastguard Worker# Compile everything all in one go.
90*c8dee2aaSAndroid Build Coastguard Workerif batchMinify:
91*c8dee2aaSAndroid Build Coastguard Worker    executeWorklist("", worklist)
92*c8dee2aaSAndroid Build Coastguard Workerelse:
93*c8dee2aaSAndroid Build Coastguard Worker    worklist.close()
94*c8dee2aaSAndroid Build Coastguard Worker    os.remove(worklist.name)
95