xref: /aosp_15_r20/external/skia/gn/compile_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 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 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 WorkerbatchCompile = True
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Workerskslc = sys.argv[1]
17*c8dee2aaSAndroid Build Coastguard Workerlang = sys.argv[2]
18*c8dee2aaSAndroid Build Coastguard Workersettings = sys.argv[3]
19*c8dee2aaSAndroid Build Coastguard Workerinput_root_dir = sys.argv[4]
20*c8dee2aaSAndroid Build Coastguard Workeroutput_root_dir = sys.argv[5]
21*c8dee2aaSAndroid Build Coastguard Worker# The last arg is a file containing a space seperated list of filenames
22*c8dee2aaSAndroid Build Coastguard Workerinput_file = sys.argv[6]
23*c8dee2aaSAndroid Build Coastguard Workerwith open(input_file, 'r') as reader:
24*c8dee2aaSAndroid Build Coastguard Worker    inputs = shlex.split(reader.read())
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Workerdef executeWorklist(input, worklist):
27*c8dee2aaSAndroid Build Coastguard Worker    # Invoke skslc, passing in the worklist.
28*c8dee2aaSAndroid Build Coastguard Worker    worklist.close()
29*c8dee2aaSAndroid Build Coastguard Worker    try:
30*c8dee2aaSAndroid Build Coastguard Worker        output = subprocess.check_output([
31*c8dee2aaSAndroid Build Coastguard Worker            skslc, worklist.name], stderr=subprocess.STDOUT).decode('utf-8', errors='ignore')
32*c8dee2aaSAndroid Build Coastguard Worker    except subprocess.CalledProcessError as err:
33*c8dee2aaSAndroid Build Coastguard Worker        if err.returncode != 1:
34*c8dee2aaSAndroid Build Coastguard Worker            print("### " + input + " skslc error:\n")
35*c8dee2aaSAndroid Build Coastguard Worker            #print("$ lldb out/Debug/skslc -- " + worklist.name + "\n\n")
36*c8dee2aaSAndroid Build Coastguard Worker            print("\n".join(err.output.decode('utf-8', errors='ignore').splitlines()))
37*c8dee2aaSAndroid Build Coastguard Worker            sys.exit(err.returncode)
38*c8dee2aaSAndroid Build Coastguard Worker        pass  # Compile errors (exit code 1) are expected and normal in test code
39*c8dee2aaSAndroid Build Coastguard Worker
40*c8dee2aaSAndroid Build Coastguard Worker    # Delete the worklist file now that execution is complete.
41*c8dee2aaSAndroid Build Coastguard Worker    os.remove(worklist.name)
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Workerdef extensionForSpirvAsm(ext):
44*c8dee2aaSAndroid Build Coastguard Worker    if (ext == '.compute'):
45*c8dee2aaSAndroid Build Coastguard Worker        return '.comp'
46*c8dee2aaSAndroid Build Coastguard Worker    return ext if (ext == '.frag' or ext == '.vert') else '.frag'
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Workerif settings != "--settings" and settings != "--nosettings":
49*c8dee2aaSAndroid Build Coastguard Worker    sys.exit("### Expected --settings or --nosettings, got " + settings)
50*c8dee2aaSAndroid Build Coastguard Worker
51*c8dee2aaSAndroid Build Coastguard Workerworklist = tempfile.NamedTemporaryFile(suffix='.worklist', delete=False, mode='w')
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Worker# Here we loop over the inputs and convert them into a worklist file for sksl-minify.
54*c8dee2aaSAndroid Build Coastguard Workerfor input in inputs:
55*c8dee2aaSAndroid Build Coastguard Worker    # Derive the target path from the input filename and remove the extension so it can
56*c8dee2aaSAndroid Build Coastguard Worker    # end with .minified.sksl
57*c8dee2aaSAndroid Build Coastguard Worker    target = input.replace(input_root_dir, output_root_dir)
58*c8dee2aaSAndroid Build Coastguard Worker    target = os.path.splitext(target)[0]
59*c8dee2aaSAndroid Build Coastguard Worker    target_dir = os.path.dirname(target)
60*c8dee2aaSAndroid Build Coastguard Worker    if not os.path.isdir(target_dir):
61*c8dee2aaSAndroid Build Coastguard Worker        os.mkdir(target_dir)
62*c8dee2aaSAndroid Build Coastguard Worker
63*c8dee2aaSAndroid Build Coastguard Worker    noExt, ext = os.path.splitext(input)
64*c8dee2aaSAndroid Build Coastguard Worker    head, tail = os.path.split(noExt)
65*c8dee2aaSAndroid Build Coastguard Worker
66*c8dee2aaSAndroid Build Coastguard Worker    if settings == "--nosettings":
67*c8dee2aaSAndroid Build Coastguard Worker        target += "StandaloneSettings"
68*c8dee2aaSAndroid Build Coastguard Worker
69*c8dee2aaSAndroid Build Coastguard Worker    if lang == "--glsl":
70*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(input + "\n")
71*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(target + ".glsl\n")
72*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(settings + "\n\n")
73*c8dee2aaSAndroid Build Coastguard Worker    elif lang == "--metal":
74*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(input + "\n")
75*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(target + ".metal\n")
76*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(settings + "\n\n")
77*c8dee2aaSAndroid Build Coastguard Worker    elif lang == "--hlsl":
78*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(input + "\n")
79*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(target + ".hlsl\n")
80*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(settings + "\n\n")
81*c8dee2aaSAndroid Build Coastguard Worker    elif lang == "--spirv":
82*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(input + "\n")
83*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(target + ".asm" + extensionForSpirvAsm(ext) + "\n")
84*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(settings + "\n\n")
85*c8dee2aaSAndroid Build Coastguard Worker    elif lang == "--skrp":
86*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(input + "\n")
87*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(target + ".skrp\n")
88*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(settings + "\n\n")
89*c8dee2aaSAndroid Build Coastguard Worker    elif lang == "--stage":
90*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(input + "\n")
91*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(target + ".stage\n")
92*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(settings + "\n\n")
93*c8dee2aaSAndroid Build Coastguard Worker    elif lang == "--wgsl":
94*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(input + "\n")
95*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(target + ".wgsl\n")
96*c8dee2aaSAndroid Build Coastguard Worker        worklist.write(settings + "\n\n")
97*c8dee2aaSAndroid Build Coastguard Worker    else:
98*c8dee2aaSAndroid Build Coastguard Worker        sys.exit("### Expected one of: --glsl --metal --hlsl --spirv --skrp " +
99*c8dee2aaSAndroid Build Coastguard Worker                 "--stage --wgsl, got " + lang)
100*c8dee2aaSAndroid Build Coastguard Worker
101*c8dee2aaSAndroid Build Coastguard Worker    # Compile items one at a time.
102*c8dee2aaSAndroid Build Coastguard Worker    if not batchCompile:
103*c8dee2aaSAndroid Build Coastguard Worker        executeWorklist(input, worklist)
104*c8dee2aaSAndroid Build Coastguard Worker        worklist = tempfile.NamedTemporaryFile(suffix='.worklist', delete=False, mode='w')
105*c8dee2aaSAndroid Build Coastguard Worker
106*c8dee2aaSAndroid Build Coastguard Worker# Compile everything all in one go.
107*c8dee2aaSAndroid Build Coastguard Workerif batchCompile:
108*c8dee2aaSAndroid Build Coastguard Worker    executeWorklist("", worklist)
109*c8dee2aaSAndroid Build Coastguard Workerelse:
110*c8dee2aaSAndroid Build Coastguard Worker    worklist.close()
111*c8dee2aaSAndroid Build Coastguard Worker    os.remove(worklist.name)
112