Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions backends/vulkan/cmake/ShaderLibrary.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ function(gen_vulkan_shader_lib_cpp shaders_path)
)
endif()

# Allow overriding GLSL PRECISION for fp16 shader variants. Empty / unset
# keeps upstream default (`highp`). Accepted values: highp, mediump, lowp.
if(EXECUTORCH_VULKAN_FP16_PRECISION)
list(APPEND GEN_SPV_ARGS "--fp16-precision"
"${EXECUTORCH_VULKAN_FP16_PRECISION}"
)
endif()

# Ninja cannot expand wildcards (*) in DEPENDS lists.
file(GLOB VULKAN_SHADERS "${shaders_path}/*.glsl" "${shaders_path}/*.glslh"
"${shaders_path}/*.yaml" "${shaders_path}/*.h"
Expand Down
24 changes: 24 additions & 0 deletions backends/vulkan/runtime/gen_vulkan_spv.py
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,7 @@ def __init__(
glslc_path: Optional[str],
glslc_flags: str = "",
replace_u16vecn: bool = False,
fp16_precision: str = "highp",
) -> None:
if isinstance(src_dir_paths, str):
self.src_dir_paths = [src_dir_paths]
Expand All @@ -678,6 +679,7 @@ def __init__(
if "-Os" in self.glslc_flags_no_opt:
self.glslc_flags_no_opt.remove("-Os")
self.replace_u16vecn = replace_u16vecn
self.fp16_precision = fp16_precision

self.src_files: Dict[str, str] = {}
self.template_yaml_files: List[str] = []
Expand Down Expand Up @@ -857,6 +859,17 @@ def create_shader_params(
for key, value in variant_params.items():
shader_params[key] = value

# Optionally override PRECISION for half-precision variants. GLSL
# `mediump` is a hint the driver may use fp16 ALUs for arithmetic.
# On Mali GPUs it's typically honored; on Adreno it's typically
# ignored (harmless). Default is `highp` to match upstream behavior.
if (
self.fp16_precision != "highp"
and shader_params.get("DTYPE") == "half"
and shader_params.get("PRECISION") == "highp"
):
shader_params["PRECISION"] = self.fp16_precision

return shader_params

def constructOutputMap(self) -> None:
Expand Down Expand Up @@ -1488,6 +1501,16 @@ def main(argv: List[str]) -> int:
default=-1,
help="Number of threads for shader compilation. -1 (default) uses all available CPU cores, 1 uses sequential compilation.",
)
parser.add_argument(
"--fp16-precision",
choices=["highp", "mediump", "lowp"],
default="highp",
help=(
"GLSL PRECISION qualifier for DTYPE=half shader variants. "
"`mediump` lets drivers (notably Mali) use fp16 ALUs for arithmetic. "
"Default `highp` matches upstream behavior. Ignored on fp32 variants."
),
)
options = parser.parse_args()

env = DEFAULT_ENV
Expand Down Expand Up @@ -1520,6 +1543,7 @@ def main(argv: List[str]) -> int:
options.glslc_path,
glslc_flags=glslc_flags_str,
replace_u16vecn=options.replace_u16vecn,
fp16_precision=options.fp16_precision,
)
output_spv_files = shader_generator.generateSPV(
options.output_path,
Expand Down
1 change: 1 addition & 0 deletions scripts/build_android_library.sh
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ build_android_native_library() {
-DEXECUTORCH_BUILD_QNN="${EXECUTORCH_BUILD_QNN}" \
-DQNN_SDK_ROOT="${QNN_SDK_ROOT}" \
-DEXECUTORCH_BUILD_VULKAN="${EXECUTORCH_BUILD_VULKAN}" \
-DEXECUTORCH_VULKAN_FP16_PRECISION="${EXECUTORCH_VULKAN_FP16_PRECISION:-highp}" \
-DXNNPACK_ENABLE_ARM_SME2="${XNNPACK_ENABLE_ARM_SME2}" \
-DSUPPORT_REGEX_LOOKAHEAD=ON \
-DCMAKE_BUILD_TYPE="${EXECUTORCH_CMAKE_BUILD_TYPE}" \
Expand Down
4 changes: 2 additions & 2 deletions tools/cmake/common/preset.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,12 @@ macro(define_overridable_option NAME DESCRIPTION VALUE_TYPE DEFAULT_VALUE)
if(DEFINED ${NAME} AND NOT DEFINED CACHE{${NAME}})
set(${NAME}
${${NAME}}
CACHE ${VALUE_TYPE} ${DESCRIPTION} FORCE
CACHE ${VALUE_TYPE} "${DESCRIPTION}" FORCE
)
else()
set(${NAME}
${DEFAULT_VALUE}
CACHE ${VALUE_TYPE} ${DESCRIPTION}
CACHE ${VALUE_TYPE} "${DESCRIPTION}"
)
endif()

Expand Down
6 changes: 6 additions & 0 deletions tools/cmake/preset/default.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,12 @@ define_overridable_option(
define_overridable_option(
EXECUTORCH_BUILD_VULKAN "Build the Vulkan backend" BOOL OFF
)
define_overridable_option(
EXECUTORCH_VULKAN_FP16_PRECISION
"GLSL PRECISION for Vulkan half-precision shader variants. Accepted values: highp, mediump, lowp. `mediump` lets Mali drivers use fp16 ALUs; ignored on Adreno. Default `highp` matches upstream."
STRING
highp
)
define_overridable_option(
EXECUTORCH_BUILD_WEBGPU "Build the WebGPU backend" BOOL OFF
)
Expand Down
Loading