| """ |
| SkOpts is built differently than the rest of our source files. See //src/core/SkOpts.h for |
| a bit more background about what SkOpts is for and how it works. |
| |
| Instead of bubbling all the headers and sources up to the top level where they are compiled in |
| one large library, we only bubble up the headers, so the default implementations in those files |
| can be built against the minimum version of Skia (which the whole library is compiled with). |
| |
| We create several libraries that contain a single source file and may need to access any of |
| Skia's headers. These libraries are each compiled with a different set of compiler flags |
| (e.g. architecture options) and linked into the final library or binary. |
| """ |
| |
| load("//:defines.bzl", "DEFAULT_DEFINES", "DEFAULT_LOCAL_DEFINES") |
| load("//bazel:copts.bzl", "DEFAULT_COPTS") |
| load("//bazel:macros.bzl", "exports_files_legacy", "selects", "skia_cc_deps", "skia_cc_library", "skia_filegroup") |
| |
| package( |
| features = [ |
| # While the OPTS_HDRS are already pulled in as textual_headers, |
| # any implicit dependency on the system headers also needs to be textual. |
| "-use_header_modules", |
| ], |
| ) |
| |
| licenses(["notice"]) |
| |
| exports_files_legacy() |
| |
| skia_filegroup( |
| name = "private_hdrs", |
| srcs = [ |
| "SkBitmapProcState_opts.h", |
| "SkBlitMask_opts.h", |
| "SkBlitRow_opts.h", |
| "SkChecksum_opts.h", |
| "SkRasterPipeline_opts.h", |
| "SkSwizzler_opts.h", |
| "SkUtils_opts.h", |
| "SkVM_opts.h", |
| "SkXfermode_opts.h", |
| ], |
| visibility = ["//src:__pkg__"], |
| ) |
| |
| OPTS_HDRS = [ |
| "//src:private_hdrs", |
| "//include:private_hdrs", |
| "//include:public_hdrs", |
| ] |
| |
| skia_cc_library( |
| name = "crc32", # https://developer.arm.com/documentation/dui0801/g/A32-and-T32-Instructions/CRC32 |
| srcs = ["SkOpts_crc32.cpp"], |
| copts = DEFAULT_COPTS + ["-march=armv8-a+crc"], |
| local_defines = DEFAULT_DEFINES + DEFAULT_LOCAL_DEFINES, |
| textual_hdrs = OPTS_HDRS, |
| ) |
| |
| skia_cc_library( |
| name = "ssse3", # https://en.wikipedia.org/wiki/SSSE3 |
| srcs = ["SkOpts_ssse3.cpp"], |
| copts = DEFAULT_COPTS + ["-mssse3"], |
| local_defines = DEFAULT_DEFINES + DEFAULT_LOCAL_DEFINES, |
| textual_hdrs = OPTS_HDRS, |
| ) |
| |
| skia_cc_library( |
| name = "sse42", # https://en.wikipedia.org/wiki/SSE4#SSE4.2 |
| srcs = ["SkOpts_sse42.cpp"], |
| copts = DEFAULT_COPTS + ["-msse4.2"], |
| local_defines = DEFAULT_DEFINES + DEFAULT_LOCAL_DEFINES, |
| textual_hdrs = OPTS_HDRS, |
| ) |
| |
| skia_cc_library( |
| name = "avx", # https://en.wikipedia.org/wiki/Advanced_Vector_Extensions |
| srcs = ["SkOpts_avx.cpp"], |
| copts = DEFAULT_COPTS + ["-mavx"], |
| local_defines = DEFAULT_DEFINES + DEFAULT_LOCAL_DEFINES, |
| textual_hdrs = OPTS_HDRS, |
| ) |
| |
| skia_cc_library( |
| name = "hsw", # https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#Advanced_Vector_Extensions_2 |
| srcs = ["SkOpts_hsw.cpp"], |
| copts = DEFAULT_COPTS + ["-march=haswell"], |
| local_defines = DEFAULT_DEFINES + DEFAULT_LOCAL_DEFINES, |
| textual_hdrs = OPTS_HDRS, |
| deps = [ |
| "//modules/skcms", # Needed to implement SkRasterPipeline_opts.h |
| ], |
| ) |
| |
| skia_cc_library( |
| name = "skx", # https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#AVX-512 |
| srcs = ["SkOpts_skx.cpp"], |
| copts = DEFAULT_COPTS + ["-march=skylake-avx512"], |
| local_defines = DEFAULT_DEFINES + DEFAULT_LOCAL_DEFINES, |
| textual_hdrs = OPTS_HDRS, |
| ) |
| |
| skia_cc_deps( |
| name = "deps", |
| visibility = ["//src:__pkg__"], |
| deps = selects.with_or({ |
| ("@platforms//cpu:x86_64", "@platforms//cpu:x86_32"): [ |
| ":avx", |
| ":hsw", |
| ":skx", |
| ":sse42", |
| ":ssse3", |
| ], |
| "@platforms//cpu:arm64": [ |
| ":crc32", |
| ], |
| # None of these opts work on WASM, so do not even bother compiling them. |
| "//bazel/common_config_settings:cpu_wasm": [], |
| "//conditions:default": [], |
| }), |
| ) |