xref: /aosp_15_r20/external/skia/experimental/webgpu-bazel/src/BUILD.bazel (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workerload("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary")
2*c8dee2aaSAndroid Build Coastguard Workerload("@rules_cc//cc:defs.bzl", "cc_binary")
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard WorkerBASE_LINKOPTS = [
5*c8dee2aaSAndroid Build Coastguard Worker    #"-flto",  # https://github.com/emscripten-core/emsdk/issues/807
6*c8dee2aaSAndroid Build Coastguard Worker    "--bind",  # Compiles the source code using the Embind bindings to connect C/C++ and JavaScript
7*c8dee2aaSAndroid Build Coastguard Worker    "-s ALLOW_MEMORY_GROWTH=1",
8*c8dee2aaSAndroid Build Coastguard Worker    "-s USE_PTHREADS=0",  # Disable pthreads
9*c8dee2aaSAndroid Build Coastguard Worker    "-s MODULARIZE=1",
10*c8dee2aaSAndroid Build Coastguard Worker    "-s EXPORT_NAME=WebGPUKitInit",
11*c8dee2aaSAndroid Build Coastguard Worker    "-s DISABLE_EXCEPTION_CATCHING=1",  # Disable all exception catching
12*c8dee2aaSAndroid Build Coastguard Worker    "-s NODEJS_CATCH_EXIT=0",  # We don't have a 'main' so disable exit() catching
13*c8dee2aaSAndroid Build Coastguard Worker    "-s WASM=1",
14*c8dee2aaSAndroid Build Coastguard Worker    "-s USE_WEBGPU=1",
15*c8dee2aaSAndroid Build Coastguard Worker    "-s ASYNCIFY",
16*c8dee2aaSAndroid Build Coastguard Worker]
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard WorkerRELEASE_OPTS = [
19*c8dee2aaSAndroid Build Coastguard Worker    "-s ASSERTIONS=0",  # Turn off assertions
20*c8dee2aaSAndroid Build Coastguard Worker    "-O3",
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker    # TODO(armansito): The closure compiler doesn't play well with Asyncify such that an
23*c8dee2aaSAndroid Build Coastguard Worker    # async Embind binding seems to lose its return value if it's awaited on from JS. While it
24*c8dee2aaSAndroid Build Coastguard Worker    # isn't strictly necessary, our example awaits on `drawWithSkia` and uses the result to the
25*c8dee2aaSAndroid Build Coastguard Worker    # update the HTML with a status message. Hence, we keep this turned off.
26*c8dee2aaSAndroid Build Coastguard Worker    "--closure 0",  # Run the closure compiler
27*c8dee2aaSAndroid Build Coastguard Worker]
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard WorkerDEBUG_OPTS = [
30*c8dee2aaSAndroid Build Coastguard Worker    "-s ASSERTIONS=1",  # Turn on assertions
31*c8dee2aaSAndroid Build Coastguard Worker    "--closure 0",  # Do not use closure
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker    # Building without optimizations causes Chrome to hit a limit when loading the WASM module with
34*c8dee2aaSAndroid Build Coastguard Worker    # the following error message:
35*c8dee2aaSAndroid Build Coastguard Worker    #   RuntimeError: Aborted(CompileError: WebAssembly.instantiate():
36*c8dee2aaSAndroid Build Coastguard Worker    #       Compiling function #6515:"blur_x_radius_3((anonymous namespace)::SkNx<8, ..." failed:
37*c8dee2aaSAndroid Build Coastguard Worker    #           local count too large @+6422486)
38*c8dee2aaSAndroid Build Coastguard Worker    #
39*c8dee2aaSAndroid Build Coastguard Worker    # As a workaround for now, we tell emscripten to enable optimizations while retaining some debug
40*c8dee2aaSAndroid Build Coastguard Worker    # information.
41*c8dee2aaSAndroid Build Coastguard Worker    "-O2 -g",
42*c8dee2aaSAndroid Build Coastguard Worker]
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Workerconfig_setting(
45*c8dee2aaSAndroid Build Coastguard Worker    name = "release_opts",
46*c8dee2aaSAndroid Build Coastguard Worker    values = {"compilation_mode": "opt"},
47*c8dee2aaSAndroid Build Coastguard Worker)
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Workerconfig_setting(
50*c8dee2aaSAndroid Build Coastguard Worker    name = "debug_opts",
51*c8dee2aaSAndroid Build Coastguard Worker    values = {"compilation_mode": "dbg"},
52*c8dee2aaSAndroid Build Coastguard Worker)
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Workercc_binary(
55*c8dee2aaSAndroid Build Coastguard Worker    name = "hello-world",
56*c8dee2aaSAndroid Build Coastguard Worker    srcs = ["bindings.cpp"],
57*c8dee2aaSAndroid Build Coastguard Worker    linkopts = select({
58*c8dee2aaSAndroid Build Coastguard Worker        ":debug_opts": BASE_LINKOPTS + DEBUG_OPTS,
59*c8dee2aaSAndroid Build Coastguard Worker        ":release_opts": BASE_LINKOPTS + RELEASE_OPTS,
60*c8dee2aaSAndroid Build Coastguard Worker        "//conditions:default": BASE_LINKOPTS + RELEASE_OPTS,
61*c8dee2aaSAndroid Build Coastguard Worker    }),
62*c8dee2aaSAndroid Build Coastguard Worker    # This target won't build successfully on its own because of missing emscripten
63*c8dee2aaSAndroid Build Coastguard Worker    # headers etc. Therefore, we hide it from wildcards.
64*c8dee2aaSAndroid Build Coastguard Worker    tags = ["manual"],
65*c8dee2aaSAndroid Build Coastguard Worker    # There probably needs to be another dep here, like //:ganesh_gl
66*c8dee2aaSAndroid Build Coastguard Worker    deps = ["//:core"],
67*c8dee2aaSAndroid Build Coastguard Worker)
68*c8dee2aaSAndroid Build Coastguard Worker
69*c8dee2aaSAndroid Build Coastguard Workerwasm_cc_binary(
70*c8dee2aaSAndroid Build Coastguard Worker    name = "hello-world-wasm",
71*c8dee2aaSAndroid Build Coastguard Worker    cc_target = ":hello-world",
72*c8dee2aaSAndroid Build Coastguard Worker)
73