xref: /aosp_15_r20/external/skia/tools/skslc/BUILD.bazel (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workerload("//bazel:skia_rules.bzl", "skia_cc_binary", "skia_cc_library", "skia_filegroup")
2*c8dee2aaSAndroid Build Coastguard Workerload(":compile_sksl.bzl", "compile_sksl")
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard Workerpackage(
5*c8dee2aaSAndroid Build Coastguard Worker    default_applicable_licenses = ["//:license"],
6*c8dee2aaSAndroid Build Coastguard Worker)
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Workerlicenses(["notice"])
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Workerskia_cc_binary(
11*c8dee2aaSAndroid Build Coastguard Worker    name = "skslc",
12*c8dee2aaSAndroid Build Coastguard Worker    srcs = [
13*c8dee2aaSAndroid Build Coastguard Worker        "Main.cpp",
14*c8dee2aaSAndroid Build Coastguard Worker    ],
15*c8dee2aaSAndroid Build Coastguard Worker    deps = [
16*c8dee2aaSAndroid Build Coastguard Worker        ":process_worklist",
17*c8dee2aaSAndroid Build Coastguard Worker        "//:core",
18*c8dee2aaSAndroid Build Coastguard Worker        "//src/sksl/codegen:glsl",
19*c8dee2aaSAndroid Build Coastguard Worker        "//src/sksl/codegen:gpu",
20*c8dee2aaSAndroid Build Coastguard Worker        "//src/sksl/codegen:hlsl",
21*c8dee2aaSAndroid Build Coastguard Worker        "//src/sksl/codegen:metal",
22*c8dee2aaSAndroid Build Coastguard Worker        "//src/sksl/codegen:spirv",
23*c8dee2aaSAndroid Build Coastguard Worker        "//src/sksl/codegen:spirv_validator",
24*c8dee2aaSAndroid Build Coastguard Worker        "//src/sksl/codegen:wgsl",
25*c8dee2aaSAndroid Build Coastguard Worker        "//src/sksl/codegen:wgsl_validator",
26*c8dee2aaSAndroid Build Coastguard Worker        "@spirv_tools",
27*c8dee2aaSAndroid Build Coastguard Worker    ],
28*c8dee2aaSAndroid Build Coastguard Worker)
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Workerskia_cc_library(
31*c8dee2aaSAndroid Build Coastguard Worker    name = "process_worklist",
32*c8dee2aaSAndroid Build Coastguard Worker    srcs = ["ProcessWorklist.cpp"],
33*c8dee2aaSAndroid Build Coastguard Worker    hdrs = ["ProcessWorklist.h"],
34*c8dee2aaSAndroid Build Coastguard Worker    visibility = ["//tools/sksl-minify:__pkg__"],
35*c8dee2aaSAndroid Build Coastguard Worker    deps = ["//:core"],
36*c8dee2aaSAndroid Build Coastguard Worker)
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Workerskia_filegroup(
39*c8dee2aaSAndroid Build Coastguard Worker    name = "glsl_tests_with_settings",
40*c8dee2aaSAndroid Build Coastguard Worker    srcs = [
41*c8dee2aaSAndroid Build Coastguard Worker        "//resources/sksl:sksl_glsl_settings_tests_sources",
42*c8dee2aaSAndroid Build Coastguard Worker        "//resources/sksl:sksl_glsl_tests_sources",
43*c8dee2aaSAndroid Build Coastguard Worker    ],
44*c8dee2aaSAndroid Build Coastguard Worker)
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker# Invoke these using:
47*c8dee2aaSAndroid Build Coastguard Worker#     bazel run //tools/skslc:compile_glsl_tests --config=compile_sksl
48*c8dee2aaSAndroid Build Coastguard Workercompile_sksl(
49*c8dee2aaSAndroid Build Coastguard Worker    name = "glsl_tests",
50*c8dee2aaSAndroid Build Coastguard Worker    inputs = ":glsl_tests_with_settings",
51*c8dee2aaSAndroid Build Coastguard Worker    lang = "glsl",
52*c8dee2aaSAndroid Build Coastguard Worker)
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Workercompile_sksl(
55*c8dee2aaSAndroid Build Coastguard Worker    name = "glsl_nosettings_tests",
56*c8dee2aaSAndroid Build Coastguard Worker    inputs = "//resources/sksl:sksl_glsl_settings_tests_sources",
57*c8dee2aaSAndroid Build Coastguard Worker    lang = "glsl",
58*c8dee2aaSAndroid Build Coastguard Worker    settings = "nosettings",
59*c8dee2aaSAndroid Build Coastguard Worker)
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Workercompile_sksl(
62*c8dee2aaSAndroid Build Coastguard Worker    name = "metal_tests",
63*c8dee2aaSAndroid Build Coastguard Worker    inputs = "//resources/sksl:sksl_metal_tests_sources",
64*c8dee2aaSAndroid Build Coastguard Worker    lang = "metal",
65*c8dee2aaSAndroid Build Coastguard Worker)
66*c8dee2aaSAndroid Build Coastguard Worker
67*c8dee2aaSAndroid Build Coastguard Workercompile_sksl(
68*c8dee2aaSAndroid Build Coastguard Worker    name = "skrp_tests",
69*c8dee2aaSAndroid Build Coastguard Worker    inputs = "//resources/sksl:sksl_skrp_tests_sources",
70*c8dee2aaSAndroid Build Coastguard Worker    lang = "skrp",
71*c8dee2aaSAndroid Build Coastguard Worker)
72*c8dee2aaSAndroid Build Coastguard Worker
73*c8dee2aaSAndroid Build Coastguard Workercompile_sksl(
74*c8dee2aaSAndroid Build Coastguard Worker    name = "stage_tests",
75*c8dee2aaSAndroid Build Coastguard Worker    inputs = "//resources/sksl:sksl_stage_tests_sources",
76*c8dee2aaSAndroid Build Coastguard Worker    lang = "stage",
77*c8dee2aaSAndroid Build Coastguard Worker)
78*c8dee2aaSAndroid Build Coastguard Worker
79*c8dee2aaSAndroid Build Coastguard Workercompile_sksl(
80*c8dee2aaSAndroid Build Coastguard Worker    name = "spirv_tests",
81*c8dee2aaSAndroid Build Coastguard Worker    inputs = "//resources/sksl:sksl_spirv_tests_sources",
82*c8dee2aaSAndroid Build Coastguard Worker    lang = "spirv",
83*c8dee2aaSAndroid Build Coastguard Worker)
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Workercompile_sksl(
86*c8dee2aaSAndroid Build Coastguard Worker    name = "hlsl_tests",
87*c8dee2aaSAndroid Build Coastguard Worker    inputs = "//resources/sksl:sksl_hlsl_tests_sources",
88*c8dee2aaSAndroid Build Coastguard Worker    lang = "hlsl",
89*c8dee2aaSAndroid Build Coastguard Worker)
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard Workercompile_sksl(
92*c8dee2aaSAndroid Build Coastguard Worker    name = "wgsl_tests",
93*c8dee2aaSAndroid Build Coastguard Worker    inputs = "//resources/sksl:sksl_wgsl_tests_sources",
94*c8dee2aaSAndroid Build Coastguard Worker    lang = "wgsl",
95*c8dee2aaSAndroid Build Coastguard Worker)
96*c8dee2aaSAndroid Build Coastguard Worker
97*c8dee2aaSAndroid Build Coastguard Worker_SKSL_COMPILE_TESTS = """
98*c8dee2aaSAndroid Build Coastguard Workerimport glob
99*c8dee2aaSAndroid Build Coastguard Workerimport os
100*c8dee2aaSAndroid Build Coastguard Workerimport shutil
101*c8dee2aaSAndroid Build Coastguard Workerimport subprocess
102*c8dee2aaSAndroid Build Coastguard Workerimport sys
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Worker# https://bazel.build/docs/user-manual#running-executables
105*c8dee2aaSAndroid Build Coastguard Worker# Note: Bazel eats single quotes, so we must use double quotes.
106*c8dee2aaSAndroid Build Coastguard Workeros.chdir(os.environ["BUILD_WORKSPACE_DIRECTORY"])
107*c8dee2aaSAndroid Build Coastguard Worker
108*c8dee2aaSAndroid Build Coastguard Worker# execpath returns the path to the given label relative to the Skia root.
109*c8dee2aaSAndroid Build Coastguard Worker# This will be something like:
110*c8dee2aaSAndroid Build Coastguard Worker#   bazel-out/k8-opt-exec-81C6BA4F/bin/tools/sksl-minify/sksl_minify
111*c8dee2aaSAndroid Build Coastguard Worker# https://bazel.build/reference/be/make-variables#predefined_label_variables
112*c8dee2aaSAndroid Build Coastguard Worker# We then find the absolute path because this is easier to debug and more
113*c8dee2aaSAndroid Build Coastguard Worker# consistent if the script we are calling changes the working directory.
114*c8dee2aaSAndroid Build Coastguard Workersksl_compile_exe = os.path.abspath("$(execpath //tools/skslc:skslc)")
115*c8dee2aaSAndroid Build Coastguard Workercompile_tests_script = os.path.abspath("$(execpath //gn:compile_sksl_tests)")
116*c8dee2aaSAndroid Build Coastguard Worker
117*c8dee2aaSAndroid Build Coastguard Worker# The last argument passed in is a file path from the root of the skia dir to a file
118*c8dee2aaSAndroid Build Coastguard Worker# containing all the tests we want to process.
119*c8dee2aaSAndroid Build Coastguard Workerinput_file = os.path.abspath(sys.argv[-1])
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker# skslc runs in standalone mode, which means it needs to read in several sksl files
122*c8dee2aaSAndroid Build Coastguard Worker# instead of them being compiled in. These files need to be copied to the location
123*c8dee2aaSAndroid Build Coastguard Worker# the executable is in, which is where it expects them.
124*c8dee2aaSAndroid Build Coastguard Workerfor sksl_file in glob.glob("src/sksl/*.sksl"):
125*c8dee2aaSAndroid Build Coastguard Worker    shutil.copy(sksl_file, os.path.dirname(sksl_compile_exe))
126*c8dee2aaSAndroid Build Coastguard Worker
127*c8dee2aaSAndroid Build Coastguard Workerresult = subprocess.run([
128*c8dee2aaSAndroid Build Coastguard Worker    compile_tests_script,
129*c8dee2aaSAndroid Build Coastguard Worker    sksl_compile_exe,
130*c8dee2aaSAndroid Build Coastguard Worker] + sys.argv[1:-1] + [input_file], capture_output=True, encoding="utf-8")
131*c8dee2aaSAndroid Build Coastguard Workerprint(result.stdout)
132*c8dee2aaSAndroid Build Coastguard Workersys.exit(result.returncode)
133*c8dee2aaSAndroid Build Coastguard Worker"""
134*c8dee2aaSAndroid Build Coastguard Worker
135*c8dee2aaSAndroid Build Coastguard Workergenrule(
136*c8dee2aaSAndroid Build Coastguard Worker    name = "create_sksl_compile_tests_script",
137*c8dee2aaSAndroid Build Coastguard Worker    # By putting skslc in srcs, this will be compiled for
138*c8dee2aaSAndroid Build Coastguard Worker    # the target platform, not the exec platform. Importantly, this means that the
139*c8dee2aaSAndroid Build Coastguard Worker    # Bazel config (e.g. no_config) will properly be applied to it. This shouldn't
140*c8dee2aaSAndroid Build Coastguard Worker    # cause any problems unless the outputs of the compilation are
141*c8dee2aaSAndroid Build Coastguard Worker    # used as the inputs to another step, because then cross-compiling
142*c8dee2aaSAndroid Build Coastguard Worker    # would break (as we would be unable to, for example, run the
143*c8dee2aaSAndroid Build Coastguard Worker    # "compiled for android skslc" on the exec machine that
144*c8dee2aaSAndroid Build Coastguard Worker    # is running the Python script.
145*c8dee2aaSAndroid Build Coastguard Worker    srcs = [":skslc"],
146*c8dee2aaSAndroid Build Coastguard Worker    outs = ["sksl_compile_tests.py"],
147*c8dee2aaSAndroid Build Coastguard Worker    cmd = "echo '%s' > $@" % _SKSL_COMPILE_TESTS,
148*c8dee2aaSAndroid Build Coastguard Worker    tools = [
149*c8dee2aaSAndroid Build Coastguard Worker        "//gn:compile_sksl_tests",
150*c8dee2aaSAndroid Build Coastguard Worker    ],
151*c8dee2aaSAndroid Build Coastguard Worker)
152