# ANGLE Development

ANGLE provides OpenGL ES 3.1 and EGL 1.5 libraries and tests. You can use these to build and run OpenGL ES applications on Windows, Linux, Mac and Android.

## Development setup

### Version Control

ANGLE uses git for version control. Helpful documentation can be found at [http://git-scm.com/install](http://git-scm.com/install).

### Required First Setup (do this first)

Note: If you are building inside a Chromium checkout (i.e. to build the Chrome browser) [see these instructions instead](https://chromium.googlesource.com/angle/angle/+/HEAD/doc/BuildingAngleForChromiumDevelopment.md).  Otherwise, continue to build a standalone version of ANGLE (e.g. for a layered driver on Android).

Required on all platforms:

 * [Python 3](https://www.python.org/downloads/) must be available in your path.
 * [depot_tools](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up)
   * Required to download dependencies (with gclient), generate build files (with GN), and compile ANGLE (with ninja).
   * Ensure `depot_tools` is in your path as it provides ninja for compilation.
 * For Googlers, run `download_from_google_storage --config` to login to Google Storage before fetching the source.

On Windows:

 * ***IMPORTANT: Set `DEPOT_TOOLS_WIN_TOOLCHAIN=0` in your environment if you are not a Googler.***
 * Install [Visual Studio Community 2022](https://visualstudio.microsoft.com/vs/)
 * Install the [Windows SDK](https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/).
   * You can install it through Visual Studio Installer if available. It might be necessary to switch to the `Individual components` tab to find the latest version.
   * The currently supported Windows SDK version can be found in [vs_toolchain.py](https://chromium.googlesource.com/chromium/src/build/+/refs/heads/main/vs_toolchain.py).
   * The SDK is required for GN-generated Visual Studio projects, the D3D Debug runtime, and the latest HLSL Compiler runtime.
 * (optional) See the [Chromium Windows build instructions](https://chromium.googlesource.com/chromium/src/+/main/docs/windows_build_instructions.md) for more info.

On Linux (required for Android development):

 * Dependencies will be handled later (see `install-build-deps.sh` below).

On MacOS:

 * [XCode](https://developer.apple.com/xcode/) for Clang and development files.
 * For Googlers on MacOS, you'll first need authorization to download macOS SDK's from Chromium
   servers before running `gclient sync`. Obtain this authorization via `cipd auth-login`
   and following the instructions.

### Getting the source

```
mkdir angle
cd angle
fetch angle
```

If you're contributing code, you will also need to set up the Git `commit-msg` hook. See [ContributingCode#getting-started-with-gerrit](ContributingCode.md#getting-started-with-gerrit) for instructions.

On Linux only, you need to install all the necessary dependencies before going further by running this command:
```
./build/install-build-deps.sh
```

If building for Android (which requires Linux), switch to the [Android steps](https://chromium.googlesource.com/angle/angle.git/+/HEAD/doc/DevSetupAndroid.md) at this point.

### Building the code

After the above completes successfully, you are ready to generate the ninja
files:
```
gn gen out/Debug
```

If you had trouble checking out the code, please inspect the error message. As
a reminder, on Windows, ensure you **set `DEPOT_TOOLS_WIN_TOOLCHAIN=0` in
your environment if you are not a Googler**. If you are a Googler, ensure you
ran `download_from_google_storage --config`.

GN will generate ninja files. The default build options build ANGLE with clang
and in release mode. Often, the default options are the desired ones, but
they can be changed by running `gn args out/Debug`. Some options that are
commonly overriden for development are:

```
is_component_build = true/false      (false forces static links of dependencies)
target_cpu = "x64"/"x86"             (the default is "x64")
is_debug = true/false                (use false for release builds. is_debug = true is the default)
angle_assert_always_on = true/false  (enables release asserts and runtime debug layers)
is_clang = false (NOT RECOMMENDED)   (to use system default compiler instead of clang)
```

When building with clang, we expect the build to run against a copy of clang
that includes the chrome clang plugin. To build against an ordinary copy of
clang lacking this plugin, set `clang_use_chrome_plugins = false`.

For a release build run `gn args out/Release` and set `is_debug = false`.
Optionally set `angle_assert_always_on = true` for Release testing.

On Windows, you can build for the Universal Windows Platform (UWP) or WinUI 3.
For UWP, set `target_os = "winuwp"` in the args. For WinUI 3, instead set
`angle_is_winappsdk=true` along with the path to the Windows App SDK
headers: `winappsdk_dir="/path/to/headers"`. The headers need to be generated
from the winmd files, which is done by running the `scripts/winappsdk_setup.py`
script and passing in the path to store the headers.
For both UWP and WinUI 3, setting `is_component_build = false` is highly
recommended to support moving libEGL.dll and libGLESv2.dll to an application's
directory and being self-contained, instead of depending on other DLLs
(d3dcompiler_47.dll is still needed for the Direct3D backend).
We also recommend using `is_clang = false`.

For more information on GN run `gn help`.

Use `autoninja` to compile on all platforms with one of the following commands:

```
autoninja -C out/Debug
autoninja -C out/Release
```

`depot_tools` provides `autoninja`, so it should be available in your path
from earlier steps. Ninja automatically calls GN to regenerate the build
files on any configuration change. `autoninja` automatically specifies a
thread count to `ninja` based on your system configuration.

### Building with Reclient (Google employees only)

Reclient is the recommended distributed compiler service to build ANGLE faster.

Step 1. Follow [Setup remote execution](https://g3doc.corp.google.com/company/teams/chrome/linux_build_instructions.md?cl=head#setup-remote-execution)
to download the required configuration, and complete the authentication.

To download the required configuration:

In .gclient, add `"download_remoteexec_cfg: True,"` in custom_vars:

```
solutions = [
  {
    # some other args
    "custom_vars": {
        "download_remoteexec_cfg": True,
    },
  },
]

```

Then run

```
gclient sync
```

To complete authentication:

1. Install gcloud SDK go/gcloud-cli#installing-and-using-the-cloud-sdk.
Make sure the gcloud tool is available on your `$PATH`.

2. Log into gcloud with your @google.com account:

```
gcloud auth login
```

If asked for a project ID, enter "0".

Step 2. Enable the usage of reclient by adding below content in GN arg:

```
use_remoteexec = true
```

### Building and Debugging with Visual Studio

To generate the Visual Studio solution in `out/Debug/angle-debug.sln`:

```
gn gen out/Debug --sln=angle-debug --ide=vs2022 --ninja-executable="C:\src\angle\third_party\ninja\ninja.exe"
```

In Visual Studio:
 1. Open the ANGLE solution file `out/Debug/angle-debug.sln`.
 2. We recommended you use `autoninja` from a command line to build manually.
 3. "Build Solution" from the IDE is broken with GN. You can use the IDE to build one target or one file at a time.

Once the build completes, all ANGLE libraries, tests, and samples will be located in `out/Debug`.

### Building ANGLE for Android

See the Android specific [documentation](DevSetupAndroid.md#ANGLE-for-Android).

### Building ANGLE for iOS simulator

This is currently possible only from Chromium checkout.
Follow [Chromium for iOS build instructions](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/ios/build_instructions.md).
GN args used by [ANGLE for iOS builder](https://ci.chromium.org/ui/p/chromium/builders/luci.chromium.ci/ios-angle-builder) are supported, e.g.:
```
dcheck_always_on = true
enable_run_ios_unittests_with_xctest = true
is_component_build = false
is_debug = false
symbol_level = 1
target_cpu = "x64"
target_environment = "simulator"
target_os = "ios"
```
Building `angle_end2end_tests` and `angle_white_box_tests` targets is supported.

## Application Development with ANGLE

This sections describes how to use ANGLE to build an OpenGL ES application.

### Choosing a Backend

ANGLE can use a variety of backing renderers based on platform.  On Windows, it defaults to D3D11 where it's available,
or D3D9 otherwise.  On other desktop platforms, it defaults to GL.  On mobile, it defaults to GLES.

ANGLE provides an EGL extension called `EGL_ANGLE_platform_angle` which allows uers to select
which renderer to use at EGL initialization time by calling eglGetPlatformDisplayEXT with special
enums. Details of the extension can be found in its specification in
`extensions/EGL_ANGLE_platform_angle.txt` and `extensions/EGL_ANGLE_platform_angle_*.txt` and
examples of its use can be seen in the ANGLE samples and tests, particularly `util/EGLWindow.cpp`.

To change the default D3D backend:

 1. Open `src/libANGLE/renderer/d3d/DisplayD3D.cpp`
 2. Locate the definition of `ANGLE_DEFAULT_D3D11` near the head of the file, and set it to your preference.

To remove any backend entirely:

 1. Run `gn args <path/to/build/dir>`
 2. Set the appropriate variable to `false`. Options are:
   - `angle_enable_d3d9`
   - `angle_enable_d3d11`
   - `angle_enable_gl`
   - `angle_enable_metal`
   - `angle_enable_null`
   - `angle_enable_vulkan`
   - `angle_enable_essl`
   - `angle_enable_glsl`

### To Use ANGLE in Your Application
On Windows:

 1. Configure your build environment to have access to the `include` folder to provide access to the standard Khronos EGL and GLES2 header files.
  * For Visual C++
     * Right-click your project in the _Solution Explorer_, and select _Properties_.
     * Under the _Configuration Properties_ branch, click _C/C++_.
     * Add the relative path to the Khronos EGL and GLES2 header files to _Additional Include Directories_.
 2. Configure your build environment to have access to `libEGL.lib` and `libGLESv2.lib` found in the build output directory (see [Building ANGLE](#building-with-visual-studio)).
   * For Visual C++
     * Right-click your project in the _Solution Explorer_, and select _Properties_.
     * Under the _Configuration Properties_ branch, open the _Linker_ branch and click _Input_.
     * Add the relative paths to both the `libEGL.lib` file and `libGLESv2.lib` file to _Additional Dependencies_, separated by a semicolon.
 3. Copy `libEGL.dll` and `libGLESv2.dll` from the build output directory (see [Building ANGLE](#building-with-visual-studio)) into your application folder.
 4. Code your application to the Khronos [OpenGL ES 2.0](http://www.khronos.org/registry/gles/) and [EGL 1.4](http://www.khronos.org/registry/egl/) APIs.

On Linux and MacOS, either:

 - Link you application against `libGLESv2` and `libEGL`
 - Use `dlopen` to load the OpenGL ES and EGL entry points at runtime.

## GLSL ES Translator

In addition to OpenGL ES and EGL libraries, ANGLE also provides a GLSL ES
translator. The translator targets various back-ends, including HLSL, GLSL
for desktop and mobile, SPIR-V and Metal SL. To build the translator, build
the `angle_shader_translator` target. Run the translator binary without
arguments to see a usage message.

### Source and Building

The translator code is included with ANGLE but fully independent; it resides
in [`src/compiler`](../src/compiler). Follow the steps above for
[getting and building ANGLE](#getting-the-source) to build the translator on
the platform of your choice.

### Usage

The ANGLE [`shader_translator`](../samples/shader_translator/shader_translator.cpp)
sample demos basic C++ API usage. To translate a GLSL ES shader, call the following
functions in the same order:

 * `sh::Initialize()` initializes the translator library and must be called only once from each process using the translator.
 * `sh::ContructCompiler()` creates a translator object for vertex or fragment shader.
 * `sh::Compile()` translates the given shader.
 * `sh::Destruct()` destroys the given translator.
 * `sh::Finalize()` shuts down the translator library and must be called only once from each process using the translator.

## OpenCL Support

A few GN args are needed to enable OpenCL runtime code to be built in the ANGLE lib(s).

`args.gn`
```
# Global enable flag for OpenCL support
angle_enable_cl = true

# Enable the Vulkan backend
angle_enable_vulkan = true

# Enable the CL backend (i.e. passthrough) if needed
angle_enable_cl_passthrough = false  // or true
```

### OpenCL artifacts

The two main artifacts generated here are `OpenCL_ANGLE` and `GLESv2`:

- `OpenCL_ANGLE` : Acts as a loader for CL entrypoints from the `GLESv2` library and populates it's
API dispatch table with them.
- `GLESv2` : Is the ANGLE library itself that also includes the OpenCL entrypoints/runtime when
`angle_enable_cl = true`.

Additional `Vulkan-backend` artifacts

- `clspv_core_shared` : clspv as a shared library to compile OpenCL C source over a
[C API](https://github.com/google/clspv/blob/main/docs/C_API.md) used by the `GLESv2` library.

### OpenCL Usage

ANGLE's OpenCL implementation acts no different from any other OpenCL ICD. Applications can either link to an
existing system OpenCL-ICD-Loader, or it can link directly to the `OpenCL_ANGLE` via its exported OpenCL
entrypoints.

If using an existing system OpenCL-ICD-Loader, then make sure `OpenCL_ANGLE` can be found by the OpenCL-ICD-Loader,
see [OpenCL-ICD-Loader](https://github.com/KhronosGroup/OpenCL-ICD-Loader) for details on this.

In both cases, `OpenCL_ANGLE` works by using `LoadLibrary/dlopen` on the `GLESv2` library to build the OpenCL
dispatch table using the entrypoints/symbols from `GLESv2` library. From then on, that API dispatch table is either
given to the system ICD Loader, or if app is linked directly to the `OpenCL_ANGLE` lib, it just uses its
singular dispatch table to forward onto `GLESv2` OpenCL entrypoints.
