# Copyright 2013 The Flutter Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//flutter/impeller/tools/args.gni") import("//flutter/impeller/tools/shader_archive.gni") import("//flutter/impeller/tools/shaders_gles.gni") import("//flutter/impeller/tools/shaders_mtl.gni") import("//flutter/impeller/tools/shaders_vk.gni") # ------------------------------------------------------------------------------ # @brief A target for precompiled shaders and the associated # generated reflection library. # # @param[required] name # # The base name for the reflected C++ library. # # @param[required] shaders # # A list of GLSL shader files. # # @param[optional] analyze # # Whether to analyze shaders with malioc. Defaults to false. Shaders will # only be analyzed if the GN argument "impeller_malioc_path" is defined. # # @param[optional] enable_opengles # # Whether to compile the shaders for the OpenGL ES backend. Defaults to the # value of the GN argument "impeller_enable_opengles". # # @param[optional] gles_language_version # # The GLES version required by the shaders. # # @param[optional] metal_version # # The version of the Metal API required by the shaders. # # @param[optional] vulkan_language_version # # The SPIR-V version required by the shaders. # # @param[optional] use_half_textures # # Whether the metal shader is using half-precision textures and requires # openGL semantics when compilig SPIR-V. # # @param[optional] require_framebuffer_fetch # # Whether to require the framebuffer fetch extension for GLES fragment shaders. template("impeller_shaders") { if (defined(invoker.metal_version)) { metal_version = invoker.metal_version } use_half_textures = false if (defined(invoker.use_half_textures) && invoker.use_half_textures) { use_half_textures = true } require_framebuffer_fetch = false if (defined(invoker.require_framebuffer_fetch) && invoker.require_framebuffer_fetch) { require_framebuffer_fetch = true } not_needed([ "metal_version", "use_half_textures", "require_framebuffer_fetch", ]) enable_opengles = impeller_enable_opengles if (defined(invoker.enable_opengles)) { enable_opengles = invoker.enable_opengles } if (impeller_enable_metal) { if (!defined(metal_version)) { metal_version = "1.2" } not_needed(invoker, [ "analyze" ]) mtl_shaders = "mtl_$target_name" impeller_shaders_metal(mtl_shaders) { name = invoker.name shaders = invoker.shaders metal_version = metal_version use_half_textures = use_half_textures } } if (enable_opengles) { analyze = true if (defined(invoker.analyze) && !invoker.analyze) { analyze = false } gles_shaders = "gles_$target_name" impeller_shaders_gles(gles_shaders) { name = invoker.name require_framebuffer_fetch = require_framebuffer_fetch if (defined(invoker.gles_language_version)) { gles_language_version = invoker.gles_language_version } if (defined(invoker.gles_exclusions)) { shaders = invoker.shaders - invoker.gles_exclusions } else { shaders = invoker.shaders } analyze = analyze } } if (impeller_enable_vulkan) { analyze = true if (defined(invoker.analyze) && !invoker.analyze) { analyze = false } vk_shaders = "vk_$target_name" impeller_shaders_vk(vk_shaders) { name = invoker.name if (defined(invoker.vulkan_language_version)) { vulkan_language_version = invoker.vulkan_language_version } shaders = invoker.shaders analyze = analyze } } if (!impeller_supports_rendering) { not_needed(invoker, "*") } group(target_name) { public_deps = [] if (impeller_enable_metal) { public_deps += [ ":$mtl_shaders" ] } if (enable_opengles) { public_deps += [ ":$gles_shaders" ] } if (impeller_enable_vulkan) { public_deps += [ ":$vk_shaders" ] } } }