load("@bazel_skylib//lib:selects.bzl", "selects") load("@build_bazel_rules_apple//apple:ios.bzl", "ios_static_framework") load("@build_bazel_rules_apple//apple:macos.bzl", "macos_dylib") load("@rules_cc//cc:cc_binary.bzl", "cc_binary") load("@rules_cc//cc:cc_library.bzl", "cc_library") load("@rules_cc//cc:cc_test.bzl", "cc_test") load("@rules_cc//cc:objc_library.bzl", "objc_library") load( "//tensorflow/core/platform:build_config_root.bzl", "tf_gpu_tests_tags", ) load("//tensorflow/lite:build_def.bzl", "CXX17_BAZEL_ONLY_COPTS", "tflite_pagesize_linkopts") load("//tensorflow/lite:special_rules.bzl", "tflite_extra_gles_deps", "tflite_portable_test_suite") load("//tensorflow/lite/delegates/gpu:build_defs.bzl", "gpu_delegate_linkopts") package( # copybara:uncomment default_applicable_licenses = ["//tensorflow:LICENSE"], default_visibility = ["//visibility:public"], licenses = ["notice"], ) exports_files([ "delegate.h", "delegate_options.h", "metal_delegate.h", ]) _DELEGATE_NO_GL_DEPS = select({ "//tensorflow:android": [ ":async_buffers", "//tensorflow/lite/core/async/c:task", "//tensorflow/lite/core/async/interop/c:attribute_map", "//tensorflow/lite/core/async/interop/c:constants", "//tensorflow/lite/delegates/gpu/gl:android_sync", "//tensorflow/lite/delegates/gpu/gl:egl_environment", "//tensorflow/lite/delegates/utils", "//tensorflow/lite/delegates/utils:async_type_helpers", "//tensorflow/lite/delegates/utils:ret_macros", "//tensorflow/lite/delegates/utils:sync_fence", ], "//conditions:default": [], }) + [ ":android_hardware_buffer", ":api", ":delegate_options", ":tflite_profile", #"//third_party/GL:EGL_headers", #"//third_party/GL:GLES3_headers", # go/keep-sorted start "@com_google_absl//absl/container:flat_hash_map", "@com_google_absl//absl/container:flat_hash_set", "@com_google_absl//absl/memory", "@com_google_absl//absl/strings", "@com_google_absl//absl/types:span", "//tensorflow/lite/async:backend_async_kernel_interface", "//tensorflow/lite/core/async/interop/c:types", "//tensorflow/lite/core/c:common", "//tensorflow/lite/delegates/gpu/cl:util", "//tensorflow/lite/delegates/gpu/common:data_type", "//tensorflow/lite/delegates/gpu/common:model", "//tensorflow/lite/delegates/gpu/common:model_builder", "//tensorflow/lite/delegates/gpu/common:model_builder_helper", "//tensorflow/lite/delegates/gpu/common:quantization_util", "//tensorflow/lite/delegates/gpu/common:status", "//tensorflow/lite/delegates:serialization", "//tensorflow/lite/kernels:kernel_util", "//tensorflow/lite/profiling/telemetry", "//tensorflow/lite/profiling/telemetry/c:telemetry_setting", "//tensorflow/lite/profiling/telemetry/c:telemetry_setting_internal", "//tensorflow/lite/profiling/telemetry:telemetry_status", "//tensorflow/lite:kernel_api", "//tensorflow/lite:minimal_logging", # go/keep-sorted end ] config_setting( name = "tflite_gpu_binary_release", values = {"copt": "-DTFLITE_GPU_BINARY_RELEASE"}, ) config_setting( name = "tflite_gpu_extra_gles_deps", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:linux", ], values = { "copt": "-DTFLITE_GPU_EXTRA_GLES_DEPS", }, ) cc_library( name = "gl_delegate", srcs = ["gl_delegate.cc"], hdrs = ["gl_delegate.h"], linkopts = gpu_delegate_linkopts(), deps = [ "//tensorflow/lite:kernel_api", "//tensorflow/lite:minimal_logging", "//tensorflow/lite/core/c:common", "//tensorflow/lite/delegates/gpu/common:convert", "//tensorflow/lite/delegates/gpu/common:gpu_info", "//tensorflow/lite/delegates/gpu/common:model", "//tensorflow/lite/delegates/gpu/common:model_builder", "//tensorflow/lite/delegates/gpu/common:model_transformer", "//tensorflow/lite/delegates/gpu/common:shape", "//tensorflow/lite/delegates/gpu/common:status", "//tensorflow/lite/delegates/gpu/common:tensor", "//tensorflow/lite/delegates/gpu/common/transformations:model_transformations", "//tensorflow/lite/delegates/gpu/gl:api", "//tensorflow/lite/delegates/gpu/gl:command_queue", "//tensorflow/lite/delegates/gpu/gl:compiler", "//tensorflow/lite/delegates/gpu/gl:compiler_options", "//tensorflow/lite/delegates/gpu/gl:egl_environment", "//tensorflow/lite/delegates/gpu/gl:gl_buffer", "//tensorflow/lite/delegates/gpu/gl:gl_call", "//tensorflow/lite/delegates/gpu/gl:object", "//tensorflow/lite/delegates/gpu/gl:object_manager", "//tensorflow/lite/delegates/gpu/gl:request_gpu_info", "//tensorflow/lite/delegates/gpu/gl:runtime_options", "//tensorflow/lite/delegates/gpu/gl/converters:bhwc_to_phwc4", "//tensorflow/lite/delegates/gpu/gl/converters:phwc4_to_bhwc", "//tensorflow/lite/delegates/gpu/gl/kernels:registry", "//tensorflow/lite/delegates/gpu/gl/workgroups:best_effort_calculator", "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/types:span", ] + select({ "//conditions:default": [ "//tensorflow/lite/delegates/gpu/gl:common_cc_fbs", "//tensorflow/lite/delegates/gpu/gl:metadata_cc_fbs", "//tensorflow/lite/delegates/gpu/gl:workgroups_cc_fbs", "//tensorflow/lite/schema:schema_fbs", "@flatbuffers", ], ":tflite_gpu_binary_release": [], }) + tflite_extra_gles_deps(), ) objc_library( name = "metal_delegate", srcs = ["metal_delegate.mm"], hdrs = ["metal_delegate.h"], copts = CXX17_BAZEL_ONLY_COPTS, module_name = "TensorFlowLiteCMetal", sdk_frameworks = ["Metal"], deps = [ "//tensorflow/lite:kernel_api", "//tensorflow/lite:minimal_logging", "//tensorflow/lite/core/c:common", "//tensorflow/lite/delegates/gpu/common:convert", "//tensorflow/lite/delegates/gpu/common:gpu_info", "//tensorflow/lite/delegates/gpu/common:model", "//tensorflow/lite/delegates/gpu/common:model_builder", "//tensorflow/lite/delegates/gpu/common:model_transformer", "//tensorflow/lite/delegates/gpu/common:precision", "//tensorflow/lite/delegates/gpu/common:quantization_util", "//tensorflow/lite/delegates/gpu/common:shape", "//tensorflow/lite/delegates/gpu/common:status", "//tensorflow/lite/delegates/gpu/common:types", "//tensorflow/lite/delegates/gpu/metal:buffer_convert", "//tensorflow/lite/delegates/gpu/metal:common", "//tensorflow/lite/delegates/gpu/metal:inference_context", "//tensorflow/lite/delegates/gpu/metal:metal_spatial_tensor", "//tensorflow/lite/kernels:kernel_util", "@com_google_absl//absl/container:flat_hash_set", "@com_google_absl//absl/types:span", ], ) objc_library( name = "metal_delegate_internal", hdrs = ["metal_delegate_internal.h"], copts = CXX17_BAZEL_ONLY_COPTS, sdk_frameworks = ["Metal"], deps = ["//tensorflow/lite/delegates/gpu:metal_delegate"], ) # build -c opt --config android_arm64 --copt -Os --copt -DTFLITE_GPU_BINARY_RELEASE --linkopt -s --strip always :libtensorflowlite_gpu_gl.so cc_binary( name = "libtensorflowlite_gpu_gl.so", linkopts = [ "-Wl,-soname=libtensorflowlite_gpu_gl.so", ] + gpu_delegate_linkopts() + select({ "//tensorflow:windows": [], "//conditions:default": [ "-fvisibility=hidden", ], }) + tflite_pagesize_linkopts(), linkshared = 1, linkstatic = 1, tags = [ "nobuilder", "notap", ], deps = [":gl_delegate"], ) # build -c opt --config android_arm64 --copt -Os --copt -DTFLITE_GPU_BINARY_RELEASE --linkopt -s --strip always :libtensorflowlite_gpu_delegate.so cc_binary( name = "libtensorflowlite_gpu_delegate.so", linkopts = [ "-Wl,-soname=libtensorflowlite_gpu_delegate.so", ] + gpu_delegate_linkopts() + select({ "//tensorflow:windows": [], "//conditions:default": [ "-fvisibility=hidden", ], }), linkshared = 1, linkstatic = 1, tags = [ "nobuilder", "notap", ], deps = [":delegate"], ) # bazel build -c opt --cpu ios_arm64 --copt -Os --copt -DTFLITE_GPU_BINARY_RELEASE --copt -fvisibility=hidden --linkopt -s --strip always --cxxopt=-std=c++14 :libtensorflowlite_gpu_metal --apple_platform_type=ios ios_static_framework( name = "tensorflow_lite_gpu_framework", hdrs = [ "metal_delegate.h", "metal_delegate_internal.h", ], minimum_os_version = "12.0", deps = [":metal_delegate"], ) # Note: Support for MacOS is best-effort at the moment. # bazel build -c opt --copt -Os --copt -DTFLITE_GPU_BINARY_RELEASE --copt -fvisibility=hidden --linkopt -s --strip always --cxxopt=-std=c++14 :tensorflow_lite_gpu_dylib --apple_platform_type=macos macos_dylib( name = "tensorflow_lite_gpu_dylib", linkopts = [ "-all_load", "-dead_strip", ], minimum_os_version = "12.0", tags = [ "manual", "nobuilder", "notap", ], deps = [ ":metal_delegate", ":metal_delegate_internal", ], ) cc_library( name = "api", srcs = ["api.cc"], hdrs = ["api.h"], deps = [ "//tensorflow/lite/delegates/gpu/common:data_type", "//tensorflow/lite/delegates/gpu/common:status", "//tensorflow/lite/delegates/gpu/common:util", "//tensorflow/lite/delegates/gpu/gl:portable", "@com_google_absl//absl/types:span", "@com_google_absl//absl/types:variant", "@opencl_headers", "@vulkan_headers//:vulkan_headers_no_prototypes", ], ) cc_library( name = "spi", hdrs = ["spi.h"], deps = [ ":api", "//tensorflow/lite/delegates/gpu/common:access_type", "//tensorflow/lite/delegates/gpu/common:status", ], ) # Currently the GPU delegate needs to be built on Android (due to EGL dependency), # or built with -DCL_DELEGATE_NO_GL (disabling OpenGL backend fallback), or both. selects.config_setting_group( name = "supports_gpu_delegate", match_any = [ "//tensorflow:android", "//tensorflow/lite/delegates/gpu/cl:opencl_delegate_no_gl", ], ) cc_library( name = "delegate_options", srcs = ["delegate_options.cc"], hdrs = ["delegate_options.h"], deps = ["//tensorflow/lite/core/c:common"], ) # copybara:uncomment_begin(google-only) # cc_library( # name = "delegate_no_gl", # srcs = [ # # copybara:comment_begin(oss-only) # "android_version.cc", # # copybara:comment_end # "delegate.cc", # ], # hdrs = ["delegate.h"], # defines = ["CL_DELEGATE_NO_GL"], # linkopts = gpu_delegate_linkopts(), # deps = _DELEGATE_NO_GL_DEPS + [ # "//tensorflow/lite/delegates/gpu/cl:api_no_gl", # "//tensorflow/lite/delegates/gpu/gl:api2", # ], # ) # copybara:uncomment_end cc_library( name = "delegate", srcs = [ # copybara:comment_begin(oss-only) "android_version.cc", # copybara:comment_end "delegate.cc", ], hdrs = ["delegate.h"], linkopts = gpu_delegate_linkopts(), deps = select({ "//tensorflow/lite/delegates/gpu/cl:opencl_delegate_no_gl": [], "//conditions:default": [ "//tensorflow/lite/delegates/gpu/gl:api2", ], }) + _DELEGATE_NO_GL_DEPS + ["//tensorflow/lite/delegates/gpu/cl:api"], ) cc_library( name = "tflite_profile", srcs = ["tflite_profile.cc"], hdrs = ["tflite_profile.h"], deps = [ "//tensorflow/lite/core/api", "//tensorflow/lite/delegates/gpu/common/task:profiling_info", "@com_google_absl//absl/time", ], ) cc_library( name = "android_hardware_buffer", srcs = ["android_hardware_buffer.cc"], hdrs = ["android_hardware_buffer.h"], ) cc_test( name = "android_hardware_buffer_test", srcs = ["android_hardware_buffer_test.cc"], deps = [ ":android_hardware_buffer", "@com_google_googletest//:gtest_main", ], ) cc_library( name = "async_buffers", srcs = ["async_buffers.cc"], hdrs = ["async_buffers.h"], deps = [ ":android_hardware_buffer", ":api", "//tensorflow/lite/delegates/gpu/common:data_type", "//tensorflow/lite/delegates/gpu/gl:gl_errors", "@com_google_absl//absl/status", ], ) cc_test( name = "async_buffers_test", srcs = ["async_buffers_test.cc"], tags = tf_gpu_tests_tags() + [ "local", "nobuilder", "notap", "tflite_not_portable_ios", ], deps = [ ":android_hardware_buffer", ":api", ":async_buffers", ":delegate", "//tensorflow/lite/delegates/gpu/common:data_type", "//tensorflow/lite/delegates/gpu/gl:egl_environment", "@com_google_googletest//:gtest_main", ], ) tflite_portable_test_suite()