mirror of
https://github.com/godotengine/godot-angle-static.git
synced 2026-01-02 09:48:25 +03:00
Compare commits
30 Commits
godot/6029
...
godot-stat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
68b4dde660 | ||
|
|
89bab1e973 | ||
|
|
79136da935 | ||
|
|
71c0149624 | ||
|
|
c7c2bb9a03 | ||
|
|
b59d3589ba | ||
|
|
e63c15737c | ||
|
|
5a278e6e5c | ||
|
|
5b179da688 | ||
|
|
4c3ee872b5 | ||
|
|
81fb08a490 | ||
|
|
1c2e321260 | ||
|
|
03ec7c9c91 | ||
|
|
26b3c97973 | ||
|
|
e88ce47c87 | ||
|
|
3efc7b2e17 | ||
|
|
4a5a09f231 | ||
|
|
6e8038ec3f | ||
|
|
cc97253921 | ||
|
|
43c0ee8a73 | ||
|
|
f91c4a9b59 | ||
|
|
fb769d3c67 | ||
|
|
0843d80b31 | ||
|
|
f633dac519 | ||
|
|
92a393166a | ||
|
|
9e33007a2e | ||
|
|
a32c26072f | ||
|
|
eaa3385c3c | ||
|
|
b0997bce23 | ||
|
|
8539c2d74a |
@@ -1,59 +0,0 @@
|
||||
# Defines the ANGLE style for automatic reformatting.
|
||||
# https://code.google.com/p/angleproject/wiki/CodingStandard
|
||||
# See Clang docs: http://clang.llvm.org/docs/ClangFormatStyleOptions.html
|
||||
BasedOnStyle: Chromium
|
||||
|
||||
# Allow double brackets such as std::vector<std::vector<int>>.
|
||||
Standard: Cpp11
|
||||
|
||||
# Indent 4 spaces at a time.
|
||||
IndentWidth: 4
|
||||
|
||||
# Keep lines under 100 columns long.
|
||||
ColumnLimit: 100
|
||||
|
||||
# Always break before braces
|
||||
BreakBeforeBraces: Custom
|
||||
BraceWrapping:
|
||||
AfterCaseLabel: true
|
||||
AfterClass: true
|
||||
AfterControlStatement: true
|
||||
AfterEnum: true
|
||||
AfterFunction: true
|
||||
AfterNamespace: true
|
||||
AfterStruct: true
|
||||
AfterUnion: true
|
||||
BeforeCatch: true
|
||||
BeforeElse: true
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: false
|
||||
SplitEmptyRecord: false
|
||||
SplitEmptyNamespace: false
|
||||
|
||||
# Keeps extern "C" blocks unindented.
|
||||
AfterExternBlock: false
|
||||
|
||||
# Indent case labels.
|
||||
IndentCaseLabels: true
|
||||
|
||||
# Right-align pointers and references
|
||||
PointerAlignment: Right
|
||||
|
||||
# ANGLE likes to align things as much as possible.
|
||||
AlignOperands: true
|
||||
AlignConsecutiveAssignments: true
|
||||
|
||||
# Use 2 space negative offset for access modifiers
|
||||
AccessModifierOffset: -2
|
||||
|
||||
# TODO(jmadill): Decide if we want this on. Doesn't have an "all or none" mode.
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
|
||||
# Useful for spacing out functions in classes
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
|
||||
# Indent nested PP directives.
|
||||
IndentPPDirectives: AfterHash
|
||||
|
||||
# Include blocks style
|
||||
IncludeBlocks: Preserve
|
||||
21
.gitattributes
vendored
21
.gitattributes
vendored
@@ -1,21 +0,0 @@
|
||||
* text=auto
|
||||
*.sln eol=crlf
|
||||
*.vcxproj eol=crlf
|
||||
*.vcxproj.filters eol=crlf
|
||||
*.bat eol=crlf
|
||||
*.rc eol=crlf
|
||||
**/compiled/*.h eol=crlf
|
||||
**/shaders/gen/*.inc eol=lf
|
||||
*.sh eol=lf
|
||||
*.gn eol=lf
|
||||
*.gni eol=lf
|
||||
*.star eol=lf
|
||||
infra/config/generated/*.cfg eol=lf
|
||||
infra/config/generated/*.pyl eol=lf
|
||||
src/compiler/preprocessor/preprocessor_*.* eol=lf
|
||||
src/compiler/translator/glslang_*.* eol=lf
|
||||
src/tests/capture_tests/expected/*.* eol=lf
|
||||
|
||||
# Git conflict markers in the json file break the code generator.
|
||||
# Using a binary merge strategy forces conflicts without changing file contents.
|
||||
scripts/code_generation_hashes/*.json merge=binary
|
||||
263
.github/workflows/ci.yaml
vendored
Normal file
263
.github/workflows/ci.yaml
vendored
Normal file
@@ -0,0 +1,263 @@
|
||||
name: Godot ANGLE static libs
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{ matrix.name }}
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
# macOS and iOS
|
||||
- name: 🍎 macOS x86_64
|
||||
platform: macos
|
||||
os: macos-latest
|
||||
xcode: "26.1.1"
|
||||
artifact-name: godot-angle-static-x86_64-macos-release
|
||||
artifact-path-angle: bin/libANGLE.macos.x86_64.a
|
||||
artifact-path-egl: bin/libEGL.macos.x86_64.a
|
||||
artifact-path-gles: bin/libGLES.macos.x86_64.a
|
||||
flags: arch=x86_64
|
||||
|
||||
- name: 🍎 macOS arm64
|
||||
platform: macos
|
||||
os: macos-latest
|
||||
xcode: "26.1.1"
|
||||
artifact-name: godot-angle-static-arm64-macos-release
|
||||
artifact-path-angle: bin/libANGLE.macos.arm64.a
|
||||
artifact-path-egl: bin/libEGL.macos.arm64.a
|
||||
artifact-path-gles: bin/libGLES.macos.arm64.a
|
||||
flags: arch=arm64
|
||||
|
||||
- name: 🍏 iOS x86_64 simulator
|
||||
platform: ios
|
||||
os: macos-latest
|
||||
xcode: "26.1.1"
|
||||
artifact-name: godot-angle-static-x86_64-ios-sim-release
|
||||
artifact-path-angle: bin/libANGLE.ios.x86_64.simulator.a
|
||||
artifact-path-egl: bin/libEGL.ios.x86_64.simulator.a
|
||||
artifact-path-gles: bin/libGLES.ios.x86_64.simulator.a
|
||||
flags: arch=x86_64 ios_simulator=yes
|
||||
|
||||
- name: 🍏 iOS arm64 simulator
|
||||
platform: ios
|
||||
os: macos-latest
|
||||
xcode: "26.1.1"
|
||||
artifact-name: godot-angle-static-arm64-ios-sim-release
|
||||
artifact-path-angle: bin/libANGLE.ios.arm64.simulator.a
|
||||
artifact-path-egl: bin/libEGL.ios.arm64.simulator.a
|
||||
artifact-path-gles: bin/libGLES.ios.arm64.simulator.a
|
||||
flags: arch=arm64 ios_simulator=yes
|
||||
|
||||
- name: 🍏 iOS arm64 device
|
||||
platform: ios
|
||||
os: macos-latest
|
||||
xcode: "26.1.1"
|
||||
artifact-name: godot-angle-static-arm64-ios-release
|
||||
artifact-path-angle: bin/libANGLE.ios.arm64.a
|
||||
artifact-path-egl: bin/libEGL.ios.arm64.a
|
||||
artifact-path-gles: bin/libGLES.ios.arm64.a
|
||||
flags: arch=arm64
|
||||
|
||||
# MinGW/LLVM libs using UCRT
|
||||
- name: 🏁 Windows - MinGW/LLVM (UCRT) x86_64
|
||||
platform: windows
|
||||
os: windows-2025
|
||||
artifact-name: godot-angle-static-x86_64-llvm-release
|
||||
artifact-path-angle: bin/libANGLE.windows.x86_64.a
|
||||
artifact-path-egl: bin/libEGL.windows.x86_64.a
|
||||
artifact-path-gles: bin/libGLES.windows.x86_64.a
|
||||
flags: use_mingw=yes arch=x86_64 use_llvm=yes mingw_prefix=$HOME/llvm-mingw
|
||||
llvm: yes
|
||||
|
||||
- name: 🏁 Windows - MinGW/LLVM (UCRT) x86_32
|
||||
platform: windows
|
||||
os: windows-2025
|
||||
artifact-name: godot-angle-static-x86_32-llvm-release
|
||||
artifact-path-angle: bin/libANGLE.windows.x86_32.a
|
||||
artifact-path-egl: bin/libEGL.windows.x86_32.a
|
||||
artifact-path-gles: bin/libGLES.windows.x86_32.a
|
||||
flags: use_mingw=yes arch=x86_32 use_llvm=yes mingw_prefix=$HOME/llvm-mingw
|
||||
llvm: yes
|
||||
|
||||
- name: 🏁 Windows - MinGW/LLVM (UCRT) arm64
|
||||
platform: windows
|
||||
os: windows-2025
|
||||
artifact-name: godot-angle-static-arm64-llvm-release
|
||||
artifact-path-angle: bin/libANGLE.windows.arm64.a
|
||||
artifact-path-egl: bin/libEGL.windows.arm64.a
|
||||
artifact-path-gles: bin/libGLES.windows.arm64.a
|
||||
flags: use_mingw=yes arch=arm64 use_llvm=yes mingw_prefix=$HOME/llvm-mingw
|
||||
llvm: yes
|
||||
|
||||
# MSVC libs
|
||||
- name: 🏁 Windows - MSVC x86_64
|
||||
platform: windows
|
||||
os: windows-2025
|
||||
artifact-name: godot-angle-static-x86_64-msvc-release
|
||||
artifact-path-angle: bin/libANGLE.windows.x86_64.lib
|
||||
artifact-path-egl: bin/libEGL.windows.x86_64.lib
|
||||
artifact-path-gles: bin/libGLES.windows.x86_64.lib
|
||||
flags: use_mingw=no arch=x86_64
|
||||
|
||||
- name: 🏁 Windows - MSVC x86_32
|
||||
platform: windows
|
||||
os: windows-2025
|
||||
artifact-name: godot-angle-static-x86_32-msvc-release
|
||||
artifact-path-angle: bin/libANGLE.windows.x86_32.lib
|
||||
artifact-path-egl: bin/libEGL.windows.x86_32.lib
|
||||
artifact-path-gles: bin/libGLES.windows.x86_32.lib
|
||||
flags: use_mingw=no arch=x86_32
|
||||
|
||||
- name: 🏁 Windows - MSVC arm64
|
||||
platform: windows
|
||||
os: windows-2025
|
||||
artifact-name: godot-angle-static-arm64-msvc-release
|
||||
artifact-path-angle: bin/libANGLE.windows.arm64.lib
|
||||
artifact-path-egl: bin/libEGL.windows.arm64.lib
|
||||
artifact-path-gles: bin/libGLES.windows.arm64.lib
|
||||
flags: use_mingw=no arch=arm64
|
||||
|
||||
# MinGW/GCC libs using MSVCRT (MinGW 15 / CRT 13)
|
||||
- name: 🏁 Windows - MinGW/GCC (MSVCRT) x86_64
|
||||
platform: windows
|
||||
os: windows-2025
|
||||
artifact-name: godot-angle-static-x86_64-gcc-13-release
|
||||
artifact-path-angle: bin/libANGLE.windows.x86_64.a
|
||||
artifact-path-egl: bin/libEGL.windows.x86_64.a
|
||||
artifact-path-gles: bin/libGLES.windows.x86_64.a
|
||||
flags: use_mingw=yes arch=x86_64 mingw_prefix=C:/mingw64
|
||||
mingw: yes
|
||||
msys: mingw64
|
||||
msysenv: x86_64
|
||||
|
||||
- name: 🏁 Windows - MinGW/GCC (MSVCRT) x86_32
|
||||
platform: windows
|
||||
os: windows-2025
|
||||
artifact-name: godot-angle-static-x86_32-gcc-13-release
|
||||
artifact-path-angle: bin/libANGLE.windows.x86_32.a
|
||||
artifact-path-egl: bin/libEGL.windows.x86_32.a
|
||||
artifact-path-gles: bin/libGLES.windows.x86_32.a
|
||||
flags: use_mingw=yes arch=x86_32 mingw_prefix=C:/mingw32
|
||||
mingw: yes
|
||||
msys: mingw32
|
||||
msysenv: i686
|
||||
|
||||
# MinGW/GCC libs using MSVCRT (MinGW 14 / CRT 12)
|
||||
- name: 🏁 Windows - MinGW/GCC (MSVCRT) x86_64
|
||||
platform: windows
|
||||
os: windows-2022
|
||||
artifact-name: godot-angle-static-x86_64-gcc-release
|
||||
artifact-path-angle: bin/libANGLE.windows.x86_64.a
|
||||
artifact-path-egl: bin/libEGL.windows.x86_64.a
|
||||
artifact-path-gles: bin/libGLES.windows.x86_64.a
|
||||
flags: use_mingw=yes arch=x86_64 mingw_prefix=C:/mingw64
|
||||
mingw: yes
|
||||
msys: mingw64
|
||||
msysenv: x86_64
|
||||
|
||||
- name: 🏁 Windows - MinGW/GCC (MSVCRT) x86_32
|
||||
platform: windows
|
||||
os: windows-2022
|
||||
artifact-name: godot-angle-static-x86_32-gcc-release
|
||||
artifact-path-angle: bin/libANGLE.windows.x86_32.a
|
||||
artifact-path-egl: bin/libEGL.windows.x86_32.a
|
||||
artifact-path-gles: bin/libGLES.windows.x86_32.a
|
||||
flags: use_mingw=yes arch=x86_32 mingw_prefix=C:/mingw32
|
||||
mingw: yes
|
||||
msys: mingw32
|
||||
msysenv: i686
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
env:
|
||||
XCODE_DEV_PATH: "/Applications/Xcode_${{ matrix.xcode }}.app/Contents/Developer"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: 'true'
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.x'
|
||||
|
||||
- name: Select Xcode version
|
||||
if: ${{ matrix.platform == 'macos' || matrix.platform == 'ios' }}
|
||||
run: sudo xcode-select -switch "${XCODE_DEV_PATH}"
|
||||
|
||||
- name: Install SCons
|
||||
run: |
|
||||
python -m pip install scons==4.9.0
|
||||
|
||||
- name: Install mako
|
||||
run: |
|
||||
python -m pip install mako
|
||||
|
||||
- name: Setup MinGW/LLVM
|
||||
if: ${{ matrix.platform == 'windows' && matrix.llvm == 'yes' }}
|
||||
run: |
|
||||
curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20250114/llvm-mingw-20250114-ucrt-x86_64.zip
|
||||
unzip -q llvm-mingw-*.zip
|
||||
rm llvm-mingw-*.zip
|
||||
mv llvm-mingw-* "$HOME/llvm-mingw"
|
||||
echo "$HOME/llvm-mingw/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Setup MinGW path
|
||||
if: ${{ matrix.mingw == 'yes' }}
|
||||
shell: bash
|
||||
run: |
|
||||
echo "C:/mingw32/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Prepare ANGLE source
|
||||
shell: bash
|
||||
run: |
|
||||
./update_angle.sh
|
||||
|
||||
- name: Build ANGLE
|
||||
run: |
|
||||
scons platform=${{ matrix.platform }} ${{ matrix.flags }} optimize=speed
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.artifact-name }}
|
||||
path: |
|
||||
${{ matrix.artifact-path-angle }}
|
||||
${{ matrix.artifact-path-egl }}
|
||||
${{ matrix.artifact-path-gles }}
|
||||
if-no-files-found: error
|
||||
|
||||
release:
|
||||
name: 'Release'
|
||||
|
||||
needs: [build]
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
steps:
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: ZIP Artifacts
|
||||
run: |
|
||||
for i in */; do (cd "${i%/}"; zip -r "../${i%/}.zip" .; cd ..); done
|
||||
|
||||
- name: Create Release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
allowUpdates: true
|
||||
removeArtifacts: true
|
||||
omitNameDuringUpdate: true
|
||||
omitBodyDuringUpdate: true
|
||||
artifacts: "*.zip"
|
||||
artifactErrorsFailBuild: true
|
||||
139
.gitignore
vendored
139
.gitignore
vendored
@@ -1,139 +1,4 @@
|
||||
.DS_Store
|
||||
.cipd
|
||||
.gclient*
|
||||
.git_cl_description_backup
|
||||
.idea/
|
||||
.vs
|
||||
.vscode
|
||||
.reproxy_cache
|
||||
.sw*
|
||||
.*.sw*
|
||||
*.Makefile
|
||||
*.ncb
|
||||
*.nvuser
|
||||
*.opensdf
|
||||
*.orig
|
||||
*.psess
|
||||
*.pyc
|
||||
*.rej
|
||||
*.sdf
|
||||
*.sln
|
||||
*.suo
|
||||
*.target.mk
|
||||
*.TMP
|
||||
*.VC.db
|
||||
*.VC.opendb
|
||||
*.vcproj
|
||||
*.vcxproj
|
||||
*.vcxproj.filters
|
||||
*.vcxproj.user
|
||||
*.vsp
|
||||
*~
|
||||
/src/tests/third_party/gles_conformance_tests
|
||||
/testing
|
||||
/third_party/abseil-cpp
|
||||
/third_party/android_build_tools
|
||||
/third_party/android_deps
|
||||
/third_party/android_platform
|
||||
/third_party/android_sdk
|
||||
/third_party/android_system_sdk/*.jar
|
||||
/third_party/android_toolchain
|
||||
/third_party/astc-encoder/src
|
||||
/third_party/bazel/desugar/*.jar
|
||||
/third_party/catapult
|
||||
/third_party/cherry
|
||||
/third_party/clang-format/script
|
||||
/third_party/colorama/src
|
||||
/third_party/cpu_features/src
|
||||
/third_party/depot_tools
|
||||
/third_party/EGL-Registry/src
|
||||
/third_party/flatbuffers/src
|
||||
/third_party/fuchsia-sdk
|
||||
/third_party/gles1_conform
|
||||
/third_party/glmark2/src
|
||||
/third_party/googletest
|
||||
/third_party/ijar
|
||||
/third_party/jdk/current
|
||||
/third_party/jdk/extras/java_8
|
||||
/third_party/jinja2
|
||||
/third_party/jsoncpp
|
||||
/third_party/kotlin_stdlib
|
||||
/third_party/libdrm
|
||||
/third_party/libc++/src
|
||||
/third_party/libc++abi/src
|
||||
/third_party/libjpeg_turbo
|
||||
/third_party/libpng/src
|
||||
/third_party/libunwind/src
|
||||
/third_party/llvm-build
|
||||
/third_party/markupsafe
|
||||
/third_party/meson
|
||||
/third_party/nasm
|
||||
/third_party/ninja
|
||||
/third_party/OpenCL-Docs/src
|
||||
/third_party/OpenCL-ICD-Loader/src
|
||||
/third_party/OpenGL-Registry/src
|
||||
/third_party/proguard/lib
|
||||
/third_party/protobuf
|
||||
/third_party/Python-Markdown
|
||||
/third_party/siso
|
||||
/third_party/qemu-linux-x64
|
||||
/third_party/qemu-mac-x64
|
||||
/third_party/r8/d8
|
||||
/third_party/r8/lib
|
||||
/third_party/rapidjson/src
|
||||
/third_party/requests/src
|
||||
/third_party/six
|
||||
/third_party/SwiftShader
|
||||
/third_party/turbine/*.jar
|
||||
/third_party/VK-GL-CTS/src
|
||||
/third_party/vulkan-deps
|
||||
/third_party/vulkan_memory_allocator
|
||||
/third_party/wayland
|
||||
/third_party/zlib
|
||||
/tools/android
|
||||
/tools/clang
|
||||
/tools/flex-bison/linux/bison
|
||||
/tools/flex-bison/linux/flex
|
||||
/tools/flex-bison/windows/bison.exe
|
||||
/tools/flex-bison/windows/flex.exe
|
||||
/tools/flex-bison/windows/m4.exe
|
||||
/tools/flex-bison/windows/msys*.dll
|
||||
/tools/glslang/glslang_validator
|
||||
/tools/glslang/glslang_validator.exe
|
||||
/tools/luci-go
|
||||
/tools/mb
|
||||
/tools/md_browser
|
||||
/tools/memory
|
||||
/tools/perf
|
||||
/tools/protoc_wrapper
|
||||
/tools/python
|
||||
/tools/skia_goldctl
|
||||
/tools/valgrind
|
||||
angle.iml
|
||||
angle_debug.txt
|
||||
/build
|
||||
/buildtools
|
||||
debug.txt
|
||||
Debug/
|
||||
Debug_ARM/
|
||||
Debug_Win32/
|
||||
Debug_x64/
|
||||
diag.txt
|
||||
ipch
|
||||
lib/*
|
||||
out
|
||||
patches-*
|
||||
Release/
|
||||
Release_ARM/
|
||||
Release_Win32/
|
||||
Release_x64/
|
||||
TestResults.qpa
|
||||
|
||||
# Any temporary files will confuse code generation.
|
||||
!scripts/code_generation_hashes/*
|
||||
|
||||
# Godot scons files.
|
||||
*.obj
|
||||
.sconsign.dblite
|
||||
bin/
|
||||
*.o
|
||||
godot-angle/
|
||||
*.pyc
|
||||
|
||||
219
.gitmodules
vendored
219
.gitmodules
vendored
@@ -1,221 +1,10 @@
|
||||
[submodule "build"]
|
||||
path = build
|
||||
url = https://chromium.googlesource.com/chromium/src/build.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "buildtools"]
|
||||
path = buildtools
|
||||
url = https://chromium.googlesource.com/chromium/src/buildtools.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/clang-format/script"]
|
||||
path = third_party/clang-format/script
|
||||
url = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "testing"]
|
||||
path = testing
|
||||
url = https://chromium.googlesource.com/chromium/src/testing
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/abseil-cpp"]
|
||||
path = third_party/abseil-cpp
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/abseil-cpp
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/android_build_tools"]
|
||||
path = third_party/android_build_tools
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/android_build_tools
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/android_deps"]
|
||||
path = third_party/android_deps
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/android_deps
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/android_platform"]
|
||||
path = third_party/android_platform
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/android_platform
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/android_sdk"]
|
||||
path = third_party/android_sdk
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/android_sdk
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "angle"]
|
||||
path = angle
|
||||
url = https://chromium.googlesource.com/angle/angle
|
||||
branch = chromium/7578
|
||||
[submodule "third_party/astc-encoder/src"]
|
||||
path = third_party/astc-encoder/src
|
||||
url = https://chromium.googlesource.com/external/github.com/ARM-software/astc-encoder
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/catapult"]
|
||||
path = third_party/catapult
|
||||
url = https://chromium.googlesource.com/catapult.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/cherry"]
|
||||
path = third_party/cherry
|
||||
url = https://android.googlesource.com/platform/external/cherry
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/colorama/src"]
|
||||
path = third_party/colorama/src
|
||||
url = https://chromium.googlesource.com/external/colorama.git
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/cpu_features/src"]
|
||||
path = third_party/cpu_features/src
|
||||
url = https://chromium.googlesource.com/external/github.com/google/cpu_features.git
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/depot_tools"]
|
||||
path = third_party/depot_tools
|
||||
url = https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/EGL-Registry/src"]
|
||||
path = third_party/EGL-Registry/src
|
||||
url = https://chromium.googlesource.com/external/github.com/KhronosGroup/EGL-Registry
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/flatbuffers/src"]
|
||||
path = third_party/flatbuffers/src
|
||||
url = https://chromium.googlesource.com/external/github.com/google/flatbuffers.git
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/gles1_conform"]
|
||||
path = third_party/gles1_conform
|
||||
url = https://chrome-internal.googlesource.com/angle/es-cts.git
|
||||
gclient-condition = checkout_angle_internal
|
||||
[submodule "third_party/glmark2/src"]
|
||||
path = third_party/glmark2/src
|
||||
url = https://chromium.googlesource.com/external/github.com/glmark2/glmark2
|
||||
[submodule "third_party/googletest"]
|
||||
path = third_party/googletest
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/googletest
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/ijar"]
|
||||
path = third_party/ijar
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/ijar
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/libdrm"]
|
||||
path = third_party/libdrm
|
||||
url = https://chromium.googlesource.com/chromiumos/third_party/libdrm
|
||||
gclient-condition = checkout_angle_mesa
|
||||
[submodule "third_party/libjpeg_turbo"]
|
||||
path = third_party/libjpeg_turbo
|
||||
url = https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/libpng/src"]
|
||||
path = third_party/libpng/src
|
||||
url = https://android.googlesource.com/platform/external/libpng
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/jinja2"]
|
||||
path = third_party/jinja2
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/jinja2
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/jsoncpp"]
|
||||
path = third_party/jsoncpp
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/jsoncpp
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/libc++/src"]
|
||||
path = third_party/libc++/src
|
||||
url = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/libc++abi/src"]
|
||||
path = third_party/libc++abi/src
|
||||
url = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/libunwind/src"]
|
||||
path = third_party/libunwind/src
|
||||
url = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/markupsafe"]
|
||||
path = third_party/markupsafe
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/markupsafe
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/mesa/src"]
|
||||
path = third_party/mesa/src
|
||||
url = https://chromium.googlesource.com/external/github.com/Mesa3D/mesa
|
||||
gclient-condition = checkout_angle_mesa
|
||||
[submodule "third_party/meson"]
|
||||
path = third_party/meson
|
||||
url = https://chromium.googlesource.com/external/github.com/mesonbuild/meson
|
||||
gclient-condition = checkout_angle_mesa
|
||||
[submodule "third_party/nasm"]
|
||||
path = third_party/nasm
|
||||
url = https://chromium.googlesource.com/chromium/deps/nasm.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/OpenCL-Docs/src"]
|
||||
path = third_party/OpenCL-Docs/src
|
||||
url = https://chromium.googlesource.com/external/github.com/KhronosGroup/OpenCL-Docs
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/OpenCL-ICD-Loader/src"]
|
||||
path = third_party/OpenCL-ICD-Loader/src
|
||||
url = https://chromium.googlesource.com/external/github.com/KhronosGroup/OpenCL-ICD-Loader
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/OpenGL-Registry/src"]
|
||||
path = third_party/OpenGL-Registry/src
|
||||
url = https://chromium.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/protobuf"]
|
||||
path = third_party/protobuf
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/protobuf
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/Python-Markdown"]
|
||||
path = third_party/Python-Markdown
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/Python-Markdown
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/rapidjson/src"]
|
||||
path = third_party/rapidjson/src
|
||||
url = https://chromium.googlesource.com/external/github.com/Tencent/rapidjson
|
||||
[submodule "third_party/requests/src"]
|
||||
path = third_party/requests/src
|
||||
url = https://chromium.googlesource.com/external/github.com/kennethreitz/requests.git
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/six"]
|
||||
path = third_party/six
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/six
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "third_party/SwiftShader"]
|
||||
path = third_party/SwiftShader
|
||||
url = https://swiftshader.googlesource.com/SwiftShader
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/VK-GL-CTS/src"]
|
||||
path = third_party/VK-GL-CTS/src
|
||||
url = https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS
|
||||
[submodule "third_party/vulkan-deps"]
|
||||
path = third_party/vulkan-deps
|
||||
url = https://chromium.googlesource.com/vulkan-deps
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/vulkan_memory_allocator"]
|
||||
path = third_party/vulkan_memory_allocator
|
||||
url = https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "third_party/wayland"]
|
||||
path = third_party/wayland
|
||||
url = https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland
|
||||
gclient-condition = not build_with_chromium and host_os == "linux"
|
||||
[submodule "third_party/zlib"]
|
||||
path = third_party/zlib
|
||||
url = https://chromium.googlesource.com/chromium/src/third_party/zlib
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "tools/android"]
|
||||
path = tools/android
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/android
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "tools/clang"]
|
||||
path = tools/clang
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/clang.git
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "tools/mb"]
|
||||
path = tools/mb
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/mb
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "tools/md_browser"]
|
||||
path = tools/md_browser
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/md_browser
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "tools/memory"]
|
||||
path = tools/memory
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/memory
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "tools/perf"]
|
||||
path = tools/perf
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/perf
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "tools/protoc_wrapper"]
|
||||
path = tools/protoc_wrapper
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/protoc_wrapper
|
||||
gclient-condition = not build_with_chromium
|
||||
[submodule "tools/python"]
|
||||
path = tools/python
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/python
|
||||
gclient-condition = checkout_android and not build_with_chromium
|
||||
[submodule "tools/valgrind"]
|
||||
path = tools/valgrind
|
||||
url = https://chromium.googlesource.com/chromium/src/tools/valgrind
|
||||
gclient-condition = not build_with_chromium
|
||||
|
||||
56
.gn
56
.gn
@@ -1,56 +0,0 @@
|
||||
# Copyright 2017 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
#
|
||||
# This file is used when gn runs in this directory (or a lower directory
|
||||
# and searching upward ends here). See "gn help dotfile."
|
||||
# As a result this file will only affect stand-alone ANGLE builds,
|
||||
# not chromium builds.
|
||||
|
||||
import("//build/dotfile_settings.gni")
|
||||
import("//dotfile_settings.gni")
|
||||
|
||||
# Location of the build configuration file.
|
||||
buildconfig = "//build/config/BUILDCONFIG.gn"
|
||||
|
||||
# The python interpreter to use by default. On Windows, this will look
|
||||
# for python3.exe and python3.bat.
|
||||
script_executable = "python3"
|
||||
|
||||
# These are the targets to check headers for by default. The files in targets
|
||||
# matching these patterns (see "gn help label_pattern" for format) will have
|
||||
# their includes checked for proper dependencies when you run either
|
||||
# "gn check" or "gn gen --check".
|
||||
check_targets = [ "*" ]
|
||||
|
||||
# These are the list of GN files that run exec_script. This allowlist exists
|
||||
# to force additional review for new uses of exec_script, which is strongly
|
||||
# discouraged except for gypi_to_gn calls.
|
||||
exec_script_whitelist = angle_dotfile_settings.exec_script_whitelist +
|
||||
build_dotfile_settings.exec_script_whitelist +
|
||||
[
|
||||
"//build/config/sysroot.gni",
|
||||
"//build/config/win/BUILD.gn",
|
||||
"//build/config/win/visual_studio_version.gni",
|
||||
"//build/gn_helpers.py",
|
||||
"//build_overrides/build.gni",
|
||||
]
|
||||
|
||||
default_args = {
|
||||
clang_use_chrome_plugins = false
|
||||
build_angle_deqp_tests = true
|
||||
use_sysroot = true
|
||||
|
||||
# Saves on importing extra dependencies and ANGLE doesn't use JS.
|
||||
enable_js_protobuf = false
|
||||
|
||||
# Saves on importing extra dependencies and ANGLE doesn't use Rust.
|
||||
enable_rust = false
|
||||
|
||||
# Disable location tags in isolates.
|
||||
tests_have_location_tags = false
|
||||
|
||||
# Use base level API level 29 support for AHardwareBuffer ANGLE tests.
|
||||
android32_ndk_api_level = 29
|
||||
android64_ndk_api_level = 29
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
[style]
|
||||
based_on_style = yapf
|
||||
column_limit = 99
|
||||
indent_width = 4
|
||||
394
.vpython
394
.vpython
@@ -1,394 +0,0 @@
|
||||
# This is a vpython "spec" file.
|
||||
#
|
||||
# It describes patterns for python wheel dependencies of the python scripts in
|
||||
# the chromium repo, particularly for dependencies that have compiled components
|
||||
# (since pure-python dependencies can be easily vendored into third_party).
|
||||
#
|
||||
# When vpython is invoked, it finds this file and builds a python VirtualEnv,
|
||||
# containing all of the dependencies described in this file, fetching them from
|
||||
# CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`,
|
||||
# this never requires the end-user machine to have a working python extension
|
||||
# compilation environment. All of these packages are built using:
|
||||
# https://chromium.googlesource.com/infra/infra/+/main/infra/tools/dockerbuild/
|
||||
#
|
||||
# All python scripts in the repo share this same spec, to avoid dependency
|
||||
# fragmentation.
|
||||
#
|
||||
# If you have depot_tools installed in your $PATH, you can invoke python scripts
|
||||
# in this repo by running them as you normally would run them, except
|
||||
# substituting `vpython` instead of `python` on the command line, e.g.:
|
||||
# vpython path/to/script.py some --arguments
|
||||
#
|
||||
# Read more about `vpython` and how to modify this file here:
|
||||
# https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md
|
||||
#
|
||||
# For the definition of this spec, see:
|
||||
# https://chromium.googlesource.com/infra/luci/luci-go/+/main/vpython/api/vpython/spec.proto
|
||||
|
||||
python_version: "2.7"
|
||||
|
||||
# Used by:
|
||||
# build/chromeos/test_runner.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/jsonlines-py2_py3"
|
||||
version: "version:1.2.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/subprocess32/${vpython_platform}"
|
||||
version: "version:3.5.0rc1"
|
||||
# Only download for linux since we shouldn't be running CrOS tests on mac/win.
|
||||
match_tag: <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_i686"
|
||||
>
|
||||
match_tag: <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# build/chromeos/test_runner.py
|
||||
# third_party/catapult
|
||||
#
|
||||
# This version must be compatible with the version range specified by
|
||||
# //third_party/catapult/telemetry/telemetry/internal/util/external_modules.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/psutil/${vpython_platform}"
|
||||
version: "version:5.2.2"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# build/lacros/test_runner.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/parameterized-py2_py3"
|
||||
version: "version:0.7.1"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# third_party/catapult
|
||||
#
|
||||
# This version must be compatible with the version range specified by
|
||||
# //third_party/catapult/telemetry/telemetry/internal/util/external_modules.py
|
||||
#
|
||||
# This version must also be compatible with the "numpy" version, as "cv2"
|
||||
# depends on "numpy". In this case, OpenCV@2.4.13.2 has been built against
|
||||
# numpy@1.11.3.
|
||||
wheel: <
|
||||
name: "infra/python/wheels/opencv_python/${vpython_platform}"
|
||||
version: "version:2.4.13.2"
|
||||
match_tag: <
|
||||
platform: "win32"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "win_amd64"
|
||||
>
|
||||
match_tag: <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_i686"
|
||||
>
|
||||
match_tag: <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "macosx_10_6_intel"
|
||||
>
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# third_party/catapult
|
||||
#
|
||||
# This version must be compatible with the version range specified by
|
||||
# //third_party/catapult/telemetry/telemetry/internal/util/external_modules.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/numpy/${vpython_platform}"
|
||||
version: "version:1.11.3"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# third_party/catapult
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pypiwin32/${vpython_platform}"
|
||||
version: "version:219"
|
||||
match_tag: <
|
||||
platform: "win32"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "win_amd64"
|
||||
>
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# chrome/test/data/android/upload_download_utils_test.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyfakefs-py2_py3"
|
||||
version: "version:3.7.2"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# tools/perf/fetch_benchmark_deps.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/google_compute_engine-py2_py3"
|
||||
version: "version:2.6.2"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/boto-py2_py3"
|
||||
version: "version:2.48.0"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# testing/buildbot/generate_buildbot_json_coveragetest.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/coverage/${vpython_platform}"
|
||||
version: "version:4.3.4"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# build/android/pylib/local/emulator/avd.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/protobuf-py2_py3"
|
||||
version: "version:3.6.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/six-py2_py3"
|
||||
version: "version:1.15.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyftpdlib-py2_py3"
|
||||
version: "version:0.7.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/simplejson/${vpython_platform}"
|
||||
version: "version:3.13.2"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# tools/perf/core/results_dashboard.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/httplib2-py2_py3"
|
||||
version: "version:0.10.3"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# tools/perf/flakiness_cli
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pandas/${vpython_platform}"
|
||||
version: "version:0.23.4"
|
||||
match_tag: <
|
||||
platform: "win32"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "win_amd64"
|
||||
>
|
||||
match_tag: <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_i686"
|
||||
>
|
||||
match_tag: <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "macosx_10_6_intel"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pytz-py2_py3"
|
||||
version: "version:2018.4"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/python-dateutil-py2_py3"
|
||||
version: "version:2.7.3"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# content/test/gpu/gpu_tests/color_profile_manager_mac.py
|
||||
# Note: there's a version of this wheel for even older OS versions,
|
||||
# but we don't need it for the GPU tests, and it looks like there are
|
||||
# bugs in the not_match_tag implementation.
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyobjc/${vpython_platform}"
|
||||
version: "version:4.1"
|
||||
match_tag: < platform: "macosx_10_10_intel" >
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# third_party/catapult
|
||||
wheel: <
|
||||
name: "infra/python/wheels/six-py2_py3"
|
||||
version: "version:1.15.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pbr-py2_py3"
|
||||
version: "version:3.0.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/funcsigs-py2_py3"
|
||||
version: "version:1.0.2"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mock-py2_py3"
|
||||
version: "version:2.0.0"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# chrome/test/chromedriver/test/run_webdriver_tests.py
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/pytest-py2_py3"
|
||||
version: "version:3.6.2"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/attrs-py2_py3"
|
||||
version: "version:17.4.0"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/six-py2_py3"
|
||||
version: "version:1.15.0"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/more-itertools-py2_py3"
|
||||
version: "version:4.1.0"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/scandir/${vpython_platform}"
|
||||
version: "version:1.7"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/pluggy-py2_py3"
|
||||
version: "version:0.7.1"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/py-py2_py3"
|
||||
version: "version:1.5.3"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/funcsigs-py2_py3"
|
||||
version: "version:1.0.2"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/psutil/${vpython_platform}"
|
||||
version: "version:5.2.2"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# tools/infra
|
||||
wheel: <
|
||||
name: "infra/python/wheels/requests-py2_py3"
|
||||
version: "version:2.13.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/colorama-py2_py3"
|
||||
version: "version:0.4.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mock-py2_py3"
|
||||
version: "version:2.0.0"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/atomicwrites-py2_py3"
|
||||
version: "version:1.3.0"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pathlib2-py2_py3"
|
||||
version: "version:2.3.3"
|
||||
>
|
||||
|
||||
# Used by Web Platform Tests (WPT) codebase in
|
||||
# //third_party/blink/web_tests/external/wpt/tools/
|
||||
wheel: <
|
||||
name: "infra/python/wheels/html5lib-py2_py3"
|
||||
version: "version:1.0.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozdebug-py2_py3"
|
||||
version: "version:0.1.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozinfo-py2_py3"
|
||||
version: "version:1.1.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozlog-py2_py3"
|
||||
version: "version:5.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozprocess-py2_py3"
|
||||
version: "version:0.26"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/urllib3-py2_py3"
|
||||
version: "version:1.22"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/blessings-py2_py3"
|
||||
version: "version:1.7"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozfile-py2_py3"
|
||||
version: "version:2.0.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozterm-py2_py3"
|
||||
version: "version:1.0.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/webencodings-py2_py3"
|
||||
version: "version:0.5.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/certifi-py2_py3"
|
||||
version: "version:2018.11.29"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/chardet-py2_py3"
|
||||
version: "version:3.0.4"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/idna-py2_py3"
|
||||
version: "version:2.8"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pillow/${vpython_platform}"
|
||||
version: "version:6.0.0"
|
||||
match_tag: <
|
||||
platform: "win32"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "win_amd64"
|
||||
>
|
||||
match_tag: <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_i686"
|
||||
>
|
||||
match_tag: <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "macosx_10_6_intel"
|
||||
>
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# //third_party/blink/tools/blinkpy/web_tests/port/server_process.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pywin32/${vpython_platform}"
|
||||
version: "version:227"
|
||||
match_tag: <
|
||||
platform: "win32"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "win_amd64"
|
||||
>
|
||||
>
|
||||
530
.vpython3
530
.vpython3
@@ -1,530 +0,0 @@
|
||||
# This is a vpython "spec" file.
|
||||
#
|
||||
# It describes patterns for python wheel dependencies of the python scripts in
|
||||
# the chromium repo, particularly for dependencies that have compiled components
|
||||
# (since pure-python dependencies can be easily vendored into third_party).
|
||||
#
|
||||
# When vpython is invoked, it finds this file and builds a python VirtualEnv,
|
||||
# containing all of the dependencies described in this file, fetching them from
|
||||
# CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`,
|
||||
# this never requires the end-user machine to have a working python extension
|
||||
# compilation environment. All of these packages are built using:
|
||||
# https://chromium.googlesource.com/infra/infra/+/main/infra/tools/dockerbuild/
|
||||
#
|
||||
# All python scripts in the repo share this same spec, to avoid dependency
|
||||
# fragmentation.
|
||||
#
|
||||
# If you have depot_tools installed in your $PATH, you can invoke python scripts
|
||||
# in this repo by running them as you normally would run them, except
|
||||
# substituting `vpython` instead of `python` on the command line, e.g.:
|
||||
# vpython path/to/script.py some --arguments
|
||||
#
|
||||
# Read more about `vpython` and how to modify this file here:
|
||||
# https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md
|
||||
|
||||
python_version: "3.8"
|
||||
|
||||
# Used by:
|
||||
# build/android/pylib/local/emulator/avd.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/protobuf-py3"
|
||||
version: "version:3.20.0"
|
||||
>
|
||||
|
||||
# TODO(https://crbug.com/898348): Add in necessary wheels as Python3 versions
|
||||
# become available.
|
||||
wheel: <
|
||||
name: "infra/python/wheels/six-py2_py3"
|
||||
version: "version:1.15.0"
|
||||
>
|
||||
|
||||
# These wheels are necessary to run pytype, i.e. enforce Python 3 type hinting.
|
||||
# We currently use 2021.11.2 instead of the 2022.5.5 available in CIPD because
|
||||
# 2022.5.5 seems to have issues when analyzing code that imports the asyncio
|
||||
# module. 2021.11.2 only has Linux wheels available, so restrict to that
|
||||
# platform.
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pytype/${vpython_platform}"
|
||||
version: "version:2021.11.2"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/importlab-py3"
|
||||
version: "version:0.6.1"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/networkx-py3"
|
||||
version: "version:2.5"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/decorator-py3"
|
||||
version: "version:5.0.9"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/libcst-py3"
|
||||
version: "version:0.3.19"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyyaml/${vpython_platform}"
|
||||
version: "version:5.4.1.chromium.1"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/typing-inspect-py3"
|
||||
version: "version:0.7.1"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/typing-extensions-py3"
|
||||
version: "version:4.0.1"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/tabulate-py3"
|
||||
version: "version:0.8.9"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/typed-ast/${vpython_platform}"
|
||||
version: "version:1.5.3"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/ninja/${vpython_platform}"
|
||||
version: "version:1.10.0.post2"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mypy-extensions-py3"
|
||||
version: "version:0.4.3"
|
||||
match_tag: <
|
||||
platform: "manylinux1_x86_64"
|
||||
>
|
||||
>
|
||||
|
||||
# Common utilities.
|
||||
# Use the same versions specified by //third_party/catapult/.vpython3 so that
|
||||
# Chromium tests using Telemetry function properly.
|
||||
wheel: <
|
||||
name: "infra/python/wheels/numpy/${vpython_platform}"
|
||||
version: "version:1.2x.supported.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pexpect/${vpython_platform}"
|
||||
version: "version:4.8.0.chromium.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/psutil/${vpython_platform}"
|
||||
version: "version:5.8.0.chromium.3"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/requests-py3"
|
||||
version: "version:2.31.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pillow/${vpython_platform}"
|
||||
version: "version:8.3.1"
|
||||
# There is currently no Linux arm/arm64 version in CIPD.
|
||||
not_match_tag <
|
||||
platform: "linux_aarch64"
|
||||
>
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/opencv_python/${vpython_platform}"
|
||||
version: "version:4.5.3.56.chromium.4"
|
||||
# There is currently no Linux arm/arm64 version in CIPD.
|
||||
not_match_tag <
|
||||
platform: "linux_aarch64"
|
||||
>
|
||||
>
|
||||
|
||||
# Used by various python unit tests.
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mock-py2_py3"
|
||||
version: "version:2.0.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/parameterized-py2_py3"
|
||||
version: "version:0.7.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pbr-py2_py3"
|
||||
version: "version:3.0.0"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyfakefs-py2_py3"
|
||||
version: "version:3.7.2"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# build/chromeos/test_runner.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/jsonlines-py2_py3"
|
||||
version: "version:1.2.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/python-dateutil-py2_py3"
|
||||
version: "version:2.7.3"
|
||||
>
|
||||
|
||||
# Used by WPT importer
|
||||
wheel: <
|
||||
name: "infra/python/wheels/charset_normalizer-py3"
|
||||
version: "version:2.0.4"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyasn1-py2_py3"
|
||||
version: "version:0.4.5"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyasn1_modules-py2_py3"
|
||||
version: "version:0.2.4"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/rsa-py2_py3"
|
||||
version: "version:3.4.2"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/cachetools-py2_py3"
|
||||
version: "version:2.0.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/uritemplate-py2_py3"
|
||||
version: "version:3.0.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/google-auth-py2_py3"
|
||||
version: "version:1.25.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/googleapis-common-protos-py2_py3"
|
||||
version: "version:1.52.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/google-api-core-py3"
|
||||
version: "version:1.31.5"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/google-auth-httplib2-py2_py3"
|
||||
version: "version:0.1.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/google-api-python-client-py3"
|
||||
version: "version:2.2.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/oauth2client-py2_py3"
|
||||
version: "version:3.0.0"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# //third_party/blink/tools/wpt_upload.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/crcmod/${vpython_platform}"
|
||||
version: "version:1.7.chromium.3"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/grpcio/${vpython_platform}"
|
||||
version: "version:1.44.0"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/grpc-google-iam-v1-py3"
|
||||
version: "version:0.12.3"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/proto-plus-py3"
|
||||
version: "version:1.20.3"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/google-cloud-kms-py3"
|
||||
version: "version:2.11.1"
|
||||
>
|
||||
|
||||
# Used by Web Platform Tests (WPT) codebase in
|
||||
# //third_party/wpt_tools
|
||||
wheel: <
|
||||
name: "infra/python/wheels/html5lib-py2_py3"
|
||||
version: "version:1.0.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozdebug-py3"
|
||||
version: "version:0.3.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozinfo-py2_py3"
|
||||
version: "version:1.2.2"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozlog-py2_py3"
|
||||
version: "version:7.1.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozprocess-py3"
|
||||
version: "version:1.3.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/urllib3-py2_py3"
|
||||
version: "version:1.24.3"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/blessings-py2_py3"
|
||||
version: "version:1.7"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozfile-py2_py3"
|
||||
version: "version:2.0.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mozterm-py2_py3"
|
||||
version: "version:1.0.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/webencodings-py2_py3"
|
||||
version: "version:0.5.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/certifi-py2_py3"
|
||||
version: "version:2020.11.8"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/chardet-py2_py3"
|
||||
version: "version:3.0.4"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/idna-py2_py3"
|
||||
version: "version:2.8"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/distro-py2_py3"
|
||||
version: "version:1.4.0"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/aioquic/${vpython_platform}"
|
||||
version: "version:0.9.15"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pylsqpack/${vpython_platform}"
|
||||
version: "version:0.3.12"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/cryptography/${vpython_platform}"
|
||||
version: "version:3.3.1.chromium.1"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/cffi/${vpython_platform}"
|
||||
version: "version:1.14.5.chromium.7"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pycparser-py2_py3"
|
||||
version: "version:2.19"
|
||||
>
|
||||
wheel: <
|
||||
name: "infra/python/wheels/ecdsa-py2_py3"
|
||||
version: "version:0.17.0"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# chrome/test/chromedriver/test/run_webdriver_tests.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/iniconfig-py3"
|
||||
version: "version:1.1.1"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/packaging-py2_py3"
|
||||
version: "version:16.8"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyparsing-py2_py3"
|
||||
version: "version:2.4.7"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/toml-py3"
|
||||
version: "version:0.10.1"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/pytest-py3"
|
||||
version: "version:6.2.2"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/pytest-asyncio-py3"
|
||||
version: "version:0.14.0"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/attrs-py2_py3"
|
||||
version: "version:21.4.0"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/six-py2_py3"
|
||||
version: "version:1.15.0"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/more-itertools-py2_py3"
|
||||
version: "version:4.1.0"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/pluggy-py3"
|
||||
version: "version:0.13.1"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/py-py2_py3"
|
||||
version: "version:1.10.0"
|
||||
>
|
||||
|
||||
wheel <
|
||||
name: "infra/python/wheels/funcsigs-py2_py3"
|
||||
version: "version:1.0.2"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/atomicwrites-py2_py3"
|
||||
version: "version:1.3.0"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/colorama-py2_py3"
|
||||
version: "version:0.4.1"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# testing/buildbot/generate_buildbot_json_coveragetest.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/coverage/${vpython_platform}"
|
||||
version: "version:5.5.chromium.3"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# //content/test/gpu
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pathos/${vpython_platform}"
|
||||
version: "version:0.2.7.chromium.5"
|
||||
not_match_tag <
|
||||
abi: "cp27mu"
|
||||
platform: "manylinux1_i686"
|
||||
>
|
||||
not_match_tag <
|
||||
abi: "cp27mu"
|
||||
platform: "linux_mips64"
|
||||
>
|
||||
not_match_tag <
|
||||
abi: "cp27mu"
|
||||
platform: "linux_armv6l"
|
||||
>
|
||||
not_match_tag <
|
||||
abi: "cp27mu"
|
||||
platform: "linux_armv7l"
|
||||
>
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/websockets-py3"
|
||||
version: "version:10.1"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# //tools/infra/find_bad_builds.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pytz-py2_py3"
|
||||
version: "version:2018.4"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# //third_party/blink/tools/blinkpy/web_tests/port/server_process.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pywin32/${vpython_platform}"
|
||||
version: "version:300"
|
||||
match_tag: <
|
||||
platform: "win32"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "win_amd64"
|
||||
>
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# //content/test/gpu/gpu_tests/color_profile_manager_mac.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pyobjc/${vpython_platform}"
|
||||
version: "version:7.3.chromium.1"
|
||||
match_tag: <
|
||||
platform: "macosx_10_10_intel"
|
||||
>
|
||||
match_tag: <
|
||||
platform: "macosx_11_0_arm64"
|
||||
>
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# tools/perf/core/results_dashboard.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/httplib2-py3"
|
||||
version: "version:0.19.1"
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# tools/perf/flakiness_cli
|
||||
wheel: <
|
||||
name: "infra/python/wheels/pandas/${vpython_platform}"
|
||||
version: "version:1.3.2.chromium.1"
|
||||
not_match_tag: <
|
||||
platform: "linux_aarch64"
|
||||
>
|
||||
>
|
||||
|
||||
# Used by:
|
||||
# testing/script/run_variations_smoke_tests.py
|
||||
wheel: <
|
||||
name: "infra/python/wheels/selenium-py3"
|
||||
version: "version:3.14.0"
|
||||
>
|
||||
|
||||
# Used by meson
|
||||
wheel: <
|
||||
name: "infra/python/wheels/markupsafe/${vpython_platform}"
|
||||
version: "version:2.0.1"
|
||||
>
|
||||
|
||||
wheel: <
|
||||
name: "infra/python/wheels/mako-py3"
|
||||
version: "version:1.2.3"
|
||||
>
|
||||
@@ -1 +0,0 @@
|
||||
scripts/export_targets.py
|
||||
86
AUTHORS
86
AUTHORS
@@ -1,86 +0,0 @@
|
||||
# This is the official list of The ANGLE Project Authors
|
||||
# for copyright purposes.
|
||||
# This file is distinct from the CONTRIBUTORS files.
|
||||
# See the latter for an explanation.
|
||||
|
||||
# Names should be added to this file as
|
||||
# Name or Organization
|
||||
# Email addresses for individuals are tracked elsewhere to avoid spam.
|
||||
|
||||
Google Inc.
|
||||
TransGaming Inc.
|
||||
3DLabs Inc. Ltd.
|
||||
|
||||
Adobe Systems Inc.
|
||||
Autodesk, Inc.
|
||||
BlackBerry Limited
|
||||
Cable Television Laboratories, Inc.
|
||||
Collabora, Ltd.
|
||||
Cloud Party, Inc.
|
||||
Igalia, S.L.
|
||||
Imagination Technologies Ltd.
|
||||
Intel Corporation
|
||||
LunarG, Inc.
|
||||
Mozilla Corporation
|
||||
Turbulenz
|
||||
Klarälvdalens Datakonsult AB
|
||||
Microsoft Corporation
|
||||
Microsoft Open Technologies, Inc.
|
||||
NVIDIA Corporation
|
||||
Opera Software ASA
|
||||
The Qt Company Ltd.
|
||||
Advanced Micro Devices, Inc.
|
||||
LG Electronics, Inc.
|
||||
IBM Inc.
|
||||
AdaptVis GmbH
|
||||
Samsung Electronics, Inc.
|
||||
Arm Ltd.
|
||||
Broadcom Inc.
|
||||
Facebook, Inc.
|
||||
The Khronos Group, Inc.
|
||||
Numfum GmbH
|
||||
Yandex LLC
|
||||
Rive
|
||||
Institute of Software, Chinese Academy of Sciences
|
||||
Guangdong OPPO Mobile Telecommunications Corp., Ltd
|
||||
|
||||
Jacek Caban
|
||||
Mark Callow
|
||||
Ginn Chen
|
||||
Tibor den Ouden
|
||||
Régis Fénéon
|
||||
James Hauxwell
|
||||
Sam Hocevar
|
||||
Pierre Leveille
|
||||
Jonathan Liu
|
||||
Boying Lu
|
||||
Aitor Moreno
|
||||
Yuri O'Donnell
|
||||
Josh Soref
|
||||
Ma Aiguo
|
||||
Maks Naumov
|
||||
Jinyoung Hur
|
||||
Sebastian Bergstein
|
||||
James Ross-Gowan
|
||||
Nickolay Artamonov
|
||||
Ihsan Akmal
|
||||
Andrei Volykhin
|
||||
Jérôme Duval
|
||||
Руслан Ижбулатов
|
||||
Thomas Miller
|
||||
Till Rathmann
|
||||
Nick Shaforostov
|
||||
Jaime Bernardo
|
||||
Le Hoang Quyen
|
||||
Ethan Lee
|
||||
Renaud Lepage
|
||||
Artem Bolgar
|
||||
Wander Lairson Costa
|
||||
Stephan Hartmann
|
||||
SeongHwan Park
|
||||
Xiaopeng Li
|
||||
Akihiko Odaki
|
||||
Ho Cheung
|
||||
Tao Wang
|
||||
Phan Quang Minh
|
||||
Hongchen Yan
|
||||
@@ -1,2 +0,0 @@
|
||||
# This file exists purely to prevent Android.mk files in subdirectories from being automatically used
|
||||
# See http://b/188491905 for more details
|
||||
237
CONTRIBUTORS
237
CONTRIBUTORS
@@ -1,237 +0,0 @@
|
||||
# This is the official list of people who can contribute
|
||||
# (and who have contributed) code to the ANGLE project
|
||||
# repository.
|
||||
# The AUTHORS file lists the copyright holders; this file
|
||||
# lists people. For example, Google employees are listed here
|
||||
# but not in AUTHORS, because Google holds the copyright.
|
||||
#
|
||||
|
||||
TransGaming Inc.
|
||||
Nicolas Capens
|
||||
Daniel Koch
|
||||
Geoff Lang
|
||||
Andrew Lewycky
|
||||
Jamie Madill
|
||||
Gavriel State
|
||||
Shannon Woods
|
||||
|
||||
Google Inc.
|
||||
Brent Austin
|
||||
Michael Bai
|
||||
John Bauman
|
||||
Peter Beverloo
|
||||
Eric Binet
|
||||
Steve Block
|
||||
Rachel Blum
|
||||
Eric Boren
|
||||
Henry Bridge
|
||||
Victor Costan
|
||||
James Dong
|
||||
Nat Duca
|
||||
Courtney Goeltzenleuchter
|
||||
Tobin Ehlis
|
||||
Ian Elliott
|
||||
Scott Graham
|
||||
Peter Kasting
|
||||
Vangelis Kokkevis
|
||||
Charlie Lao
|
||||
Jiacheng Lu
|
||||
Zhenyao Mo
|
||||
Daniel Nicoara
|
||||
Kai Ninomiya
|
||||
Cody Northrop
|
||||
Justin Novosad
|
||||
Alastair Patrick
|
||||
Alok Priyadarshi
|
||||
Kenneth Russell
|
||||
Jonah Ryan-Davis
|
||||
Brian Salomon
|
||||
Justin Schuh
|
||||
Gregg Tavares
|
||||
thestig@chromium.org
|
||||
Jeff Timanus
|
||||
Tim Van Patten
|
||||
Ben Vanik
|
||||
Adrienne Walker
|
||||
Corentin Wallez
|
||||
Shahbaz Youssefi
|
||||
Hailin Zhang
|
||||
|
||||
Adobe Systems Inc.
|
||||
Alexandru Chiculita
|
||||
Steve Minns
|
||||
Max Vujovic
|
||||
|
||||
Apple Inc.
|
||||
Dan Glastonbury
|
||||
Dean Jackson
|
||||
Kimmo Kinnunen
|
||||
Kyle Piddington
|
||||
|
||||
Autodesk, Inc.
|
||||
Ranger Harke
|
||||
|
||||
Cloud Party, Inc.
|
||||
Conor Dickinson
|
||||
|
||||
The Qt Company Ltd.
|
||||
Andrew Knight
|
||||
|
||||
Imagination Technologies Ltd.
|
||||
Gregoire Payen de La Garanderie
|
||||
Kyle Griffiths
|
||||
|
||||
Intel Corporation
|
||||
Jin Yang
|
||||
Andy Chen
|
||||
Josh Triplett
|
||||
Sudarsana Nagineni
|
||||
Jiajia Qin
|
||||
Jiawei Shao
|
||||
Jie Chen
|
||||
Qiankun Miao
|
||||
Bryan Bernhart
|
||||
Yunchao He
|
||||
Xinghua Cao
|
||||
Brandon Jones
|
||||
Enrico Galli
|
||||
|
||||
Klarälvdalens Datakonsult AB
|
||||
Milian Wolff
|
||||
|
||||
Mozilla Corp.
|
||||
Dzmitry Malyshau
|
||||
Ehsan Akhgari
|
||||
Edwin Flores
|
||||
Kelsey Gilbert
|
||||
Mike Hommey
|
||||
Benoit Jacob
|
||||
Makoto Kato
|
||||
Vladimir Vukicevic
|
||||
Josh Matthews
|
||||
|
||||
Turbulenz
|
||||
Michael Braithwaite
|
||||
|
||||
Ulrik Persson (ddefrostt)
|
||||
Mark Banner (standard8mbp)
|
||||
David Kilzer
|
||||
Jacek Caban
|
||||
Tibor den Ouden
|
||||
Régis Fénéon
|
||||
Sebastian Bergstein
|
||||
James Ross-Gowan
|
||||
Andrei Volykhin
|
||||
Jérôme Duval
|
||||
Till Rathmann
|
||||
Nick Shaforostov
|
||||
|
||||
Microsoft Corporation
|
||||
Cooper Partin
|
||||
Austin Kinross
|
||||
Mingyu Hu
|
||||
Minmin Gong
|
||||
Shawn Hargreaves
|
||||
Rafael Cintron
|
||||
James Clarke
|
||||
Nathan Zabriskie
|
||||
Patrick To
|
||||
|
||||
Microsoft Open Technologies, Inc.
|
||||
Cooper Partin
|
||||
Austin Kinross
|
||||
|
||||
NVIDIA Corporation
|
||||
Olli Etuaho
|
||||
Arun Patole
|
||||
Qingqing Deng
|
||||
Kimmo Kinnunen
|
||||
Sami Väisänen
|
||||
Martin Radev
|
||||
Joonatan Saarhelo
|
||||
Markus Tavenrath
|
||||
Anders Leino
|
||||
|
||||
Opera Software ASA
|
||||
Daniel Bratell
|
||||
Tomasz Moniuszko
|
||||
David Landell
|
||||
|
||||
Advanced Micro Devices, Inc.
|
||||
Russ Lind
|
||||
|
||||
LG Electronics, Inc.
|
||||
Jani Hautakangas
|
||||
Ivan Murashov
|
||||
|
||||
IBM Inc.
|
||||
Junliang Yan
|
||||
|
||||
AdaptVis GmbH
|
||||
Sascha Kolodzey
|
||||
|
||||
Samsung Electronics, Inc.
|
||||
Brandon Schade
|
||||
Colin Peter
|
||||
Hyunchang Kim
|
||||
Hyunseok Ko
|
||||
Jaedon Lee
|
||||
Jeff Vigil
|
||||
Jonah Taylor
|
||||
Kevin Jung
|
||||
Kyeongmin Kim
|
||||
Mahmoud Kharsa
|
||||
Mathew Prabakar
|
||||
Minkyu Jeong
|
||||
Mohan Maiya
|
||||
Nirmal Singh
|
||||
Peter Mowry
|
||||
Sangwon Park
|
||||
Saurabh Badenkal
|
||||
Younggwan Kim
|
||||
Sungyong Choi
|
||||
|
||||
Arm Ltd.
|
||||
Fei Yang
|
||||
Xinyi He
|
||||
Sunny Sun
|
||||
Xiaoxuan Liu
|
||||
Ancheng Qiao
|
||||
Amy Liu
|
||||
Jian Li
|
||||
Cheryl Wei
|
||||
Guoxing Wu
|
||||
Min Zhang
|
||||
|
||||
Broadcom Inc.
|
||||
Gary Sweet
|
||||
|
||||
Facebook, Inc.
|
||||
Artem Bolgar
|
||||
|
||||
The Khronos Group, Inc.
|
||||
Alexey Knyazev
|
||||
|
||||
Igalia, S.L.
|
||||
Jose Dapena Paz
|
||||
|
||||
Numfum GmbH
|
||||
Carl Woffenden
|
||||
|
||||
Collabora, Ltd.
|
||||
Lubosz Sarnecki
|
||||
|
||||
LunarG, Inc.
|
||||
Mark Lobodzinski
|
||||
|
||||
Valve Corporation
|
||||
Steven Noonan
|
||||
|
||||
Yandex LLC
|
||||
Andrew Naumov
|
||||
|
||||
Rive
|
||||
Chris Dalton
|
||||
|
||||
Institute of Software, Chinese Academy of Sciences
|
||||
Wang Chen
|
||||
@@ -1,4 +0,0 @@
|
||||
monorail {
|
||||
component: "Internals>GPU>ANGLE"
|
||||
}
|
||||
team_email: "angleproject@googlegroups.com"
|
||||
32
LICENSE
32
LICENSE
@@ -1,32 +0,0 @@
|
||||
// Copyright 2018 The ANGLE Project Authors.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following
|
||||
// disclaimer in the documentation and/or other materials provided
|
||||
// with the distribution.
|
||||
//
|
||||
// Neither the name of TransGaming Inc., Google Inc., 3DLabs Inc.
|
||||
// Ltd., nor the names of their contributors may be used to endorse
|
||||
// or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
@@ -1,4 +1,6 @@
|
||||
Copyright (c) 2018-2019 Arseny Kapoulkine
|
||||
# MIT License
|
||||
|
||||
Copyright (c) 2017-present Godot Engine contributors.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
97
OWNERS
97
OWNERS
@@ -1,97 +0,0 @@
|
||||
# See https://chromium.googlesource.com/angle/angle/+/main/doc/ContributingCode.md#selecting-reviewers for more info
|
||||
# Note: Owners must be split by domain to avoid git merge conflicts on platforms that cannot have
|
||||
# email addresses from all platforms. Also, to avoid downstream git merge conflicts, all changes
|
||||
# to this file should be done in the upstream ANGLE repository's main branch.
|
||||
|
||||
# @chromium.org email addresses:
|
||||
geofflang@chromium.org
|
||||
jmadill@chromium.org
|
||||
kbr@chromium.org
|
||||
syoussefi@chromium.org
|
||||
ynovikov@chromium.org
|
||||
|
||||
# @google.com email addresses:
|
||||
abdolrashidi@google.com
|
||||
cclao@google.com
|
||||
chrisforbes@google.com
|
||||
cnorthrop@google.com
|
||||
geofflang@google.com
|
||||
ianelliott@google.com
|
||||
jmadill@google.com
|
||||
jonahr@google.com
|
||||
lpy@google.com
|
||||
romanl@google.com
|
||||
solti@google.com
|
||||
srisser@google.com
|
||||
syoussefi@google.com
|
||||
vantablack@google.com
|
||||
ynovikov@google.com
|
||||
yuxinhu@google.com
|
||||
|
||||
# The auto-roller can also modify autogenerated files, so we give it ownership
|
||||
# over all ANGLE files.
|
||||
angle-autoroll@skia-public.iam.gserviceaccount.com
|
||||
|
||||
per-file AUTHORS=*
|
||||
per-file CONTRIBUTORS=*
|
||||
per-file DEPS=*
|
||||
per-file WATCHLISTS=*
|
||||
|
||||
# Allow anyone to update gitlinks just like DEPS.
|
||||
per-file build=*
|
||||
per-file buildtools=*
|
||||
per-file third_party/clang-format/script=*
|
||||
per-file testing=*
|
||||
per-file third_party/abseil-cpp=*
|
||||
per-file third_party/android_build_tools=*
|
||||
per-file third_party/android_deps=*
|
||||
per-file third_party/android_platform=*
|
||||
per-file third_party/android_sdk=*
|
||||
per-file third_party/astc-encoder/src=*
|
||||
per-file third_party/catapult=*
|
||||
per-file third_party/cherry=*
|
||||
per-file third_party/colorama/src=*
|
||||
per-file third_party/cpu_features/src=*
|
||||
per-file third_party/depot_tools=*
|
||||
per-file third_party/dummy_chromium=*
|
||||
per-file third_party/EGL-Registry/src=*
|
||||
per-file third_party/flatbuffers/src=*
|
||||
per-file third_party/gles1_conform=*
|
||||
per-file third_party/glmark2/src=*
|
||||
per-file third_party/googletest=*
|
||||
per-file third_party/ijar=*
|
||||
per-file third_party/libdrm=*
|
||||
per-file third_party/libjpeg_turbo=*
|
||||
per-file third_party/libpng/src=*
|
||||
per-file third_party/jinja2=*
|
||||
per-file third_party/jsoncpp=*
|
||||
per-file third_party/libc++/src=*
|
||||
per-file third_party/libc++abi/src=*
|
||||
per-file third_party/libunwind/src=*
|
||||
per-file third_party/markupsafe=*
|
||||
per-file third_party/mesa/src=*
|
||||
per-file third_party/meson=*
|
||||
per-file third_party/nasm=*
|
||||
per-file third_party/OpenCL-Docs/src=*
|
||||
per-file third_party/OpenCL-ICD-Loader/src=*
|
||||
per-file third_party/OpenGL-Registry/src=*
|
||||
per-file third_party/protobuf=*
|
||||
per-file third_party/Python-Markdown=*
|
||||
per-file third_party/rapidjson/src=*
|
||||
per-file third_party/requests/src=*
|
||||
per-file third_party/six=*
|
||||
per-file third_party/SwiftShader=*
|
||||
per-file third_party/VK-GL-CTS/src=*
|
||||
per-file third_party/vulkan-deps=*
|
||||
per-file third_party/vulkan_memory_allocator=*
|
||||
per-file third_party/wayland=*
|
||||
per-file third_party/zlib=*
|
||||
per-file tools/android=*
|
||||
per-file tools/clang=*
|
||||
per-file tools/mb=*
|
||||
per-file tools/md_browser=*
|
||||
per-file tools/memory=*
|
||||
per-file tools/perf=*
|
||||
per-file tools/protoc_wrapper=*
|
||||
per-file tools/python=*
|
||||
per-file tools/valgrind=*
|
||||
510
PRESUBMIT.py
510
PRESUBMIT.py
@@ -1,510 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
"""Top-level presubmit script for code generation.
|
||||
|
||||
See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
|
||||
for more details on the presubmit API built into depot_tools.
|
||||
"""
|
||||
|
||||
import itertools
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import textwrap
|
||||
import pathlib
|
||||
|
||||
# This line is 'magic' in that git-cl looks for it to decide whether to
|
||||
# use Python3 instead of Python2 when running the code in this file.
|
||||
USE_PYTHON3 = True
|
||||
|
||||
# Fragment of a regular expression that matches C/C++ and Objective-C++ implementation files and headers.
|
||||
_IMPLEMENTATION_AND_HEADER_EXTENSIONS = r'\.(c|cc|cpp|cxx|mm|h|hpp|hxx)$'
|
||||
|
||||
# Fragment of a regular expression that matches C++ and Objective-C++ header files.
|
||||
_HEADER_EXTENSIONS = r'\.(h|hpp|hxx)$'
|
||||
|
||||
_PRIMARY_EXPORT_TARGETS = [
|
||||
'//:libEGL',
|
||||
'//:libGLESv1_CM',
|
||||
'//:libGLESv2',
|
||||
'//:translator',
|
||||
]
|
||||
|
||||
|
||||
def _SplitIntoMultipleCommits(description_text):
|
||||
paragraph_split_pattern = r"(?m)(^\s*$\n)"
|
||||
multiple_paragraphs = re.split(paragraph_split_pattern, description_text)
|
||||
multiple_commits = [""]
|
||||
change_id_pattern = re.compile(r"(?m)^Change-Id: [a-zA-Z0-9]*$")
|
||||
for paragraph in multiple_paragraphs:
|
||||
multiple_commits[-1] += paragraph
|
||||
if change_id_pattern.search(paragraph):
|
||||
multiple_commits.append("")
|
||||
if multiple_commits[-1] == "":
|
||||
multiple_commits.pop()
|
||||
return multiple_commits
|
||||
|
||||
|
||||
def _CheckCommitMessageFormatting(input_api, output_api):
|
||||
|
||||
def _IsLineBlank(line):
|
||||
return line.isspace() or line == ""
|
||||
|
||||
def _PopBlankLines(lines, reverse=False):
|
||||
if reverse:
|
||||
while len(lines) > 0 and _IsLineBlank(lines[-1]):
|
||||
lines.pop()
|
||||
else:
|
||||
while len(lines) > 0 and _IsLineBlank(lines[0]):
|
||||
lines.pop(0)
|
||||
|
||||
def _IsTagLine(line):
|
||||
return ":" in line
|
||||
|
||||
def _CheckTabInCommit(lines):
|
||||
return all([line.find("\t") == -1 for line in lines])
|
||||
|
||||
allowlist_strings = ['Revert', 'Roll', 'Manual roll', 'Reland', 'Re-land']
|
||||
summary_linelength_warning_lower_limit = 65
|
||||
summary_linelength_warning_upper_limit = 70
|
||||
description_linelength_limit = 72
|
||||
|
||||
git_output = input_api.change.DescriptionText()
|
||||
|
||||
multiple_commits = _SplitIntoMultipleCommits(git_output)
|
||||
errors = []
|
||||
|
||||
for k in range(len(multiple_commits)):
|
||||
commit_msg_lines = multiple_commits[k].splitlines()
|
||||
commit_number = len(multiple_commits) - k
|
||||
commit_tag = "Commit " + str(commit_number) + ":"
|
||||
commit_msg_line_numbers = {}
|
||||
for i in range(len(commit_msg_lines)):
|
||||
commit_msg_line_numbers[commit_msg_lines[i]] = i + 1
|
||||
_PopBlankLines(commit_msg_lines, True)
|
||||
_PopBlankLines(commit_msg_lines, False)
|
||||
allowlisted = False
|
||||
if len(commit_msg_lines) > 0:
|
||||
for allowlist_string in allowlist_strings:
|
||||
if commit_msg_lines[0].startswith(allowlist_string):
|
||||
allowlisted = True
|
||||
break
|
||||
if allowlisted:
|
||||
continue
|
||||
|
||||
if not _CheckTabInCommit(commit_msg_lines):
|
||||
errors.append(
|
||||
output_api.PresubmitError(commit_tag + "Tabs are not allowed in commit message."))
|
||||
|
||||
# the tags paragraph is at the end of the message
|
||||
# the break between the tags paragraph is the first line without ":"
|
||||
# this is sufficient because if a line is blank, it will not have ":"
|
||||
last_paragraph_line_count = 0
|
||||
while len(commit_msg_lines) > 0 and _IsTagLine(commit_msg_lines[-1]):
|
||||
last_paragraph_line_count += 1
|
||||
commit_msg_lines.pop()
|
||||
if last_paragraph_line_count == 0:
|
||||
errors.append(
|
||||
output_api.PresubmitError(
|
||||
commit_tag +
|
||||
"Please ensure that there are tags (e.g., Bug:, Test:) in your description."))
|
||||
if len(commit_msg_lines) > 0:
|
||||
if not _IsLineBlank(commit_msg_lines[-1]):
|
||||
output_api.PresubmitError(commit_tag +
|
||||
"Please ensure that there exists 1 blank line " +
|
||||
"between tags and description body.")
|
||||
else:
|
||||
# pop the blank line between tag paragraph and description body
|
||||
commit_msg_lines.pop()
|
||||
if len(commit_msg_lines) > 0 and _IsLineBlank(commit_msg_lines[-1]):
|
||||
errors.append(
|
||||
output_api.PresubmitError(
|
||||
commit_tag + 'Please ensure that there exists only 1 blank line '
|
||||
'between tags and description body.'))
|
||||
# pop all the remaining blank lines between tag and description body
|
||||
_PopBlankLines(commit_msg_lines, True)
|
||||
if len(commit_msg_lines) == 0:
|
||||
errors.append(
|
||||
output_api.PresubmitError(commit_tag +
|
||||
'Please ensure that your description summary'
|
||||
' and description body are not blank.'))
|
||||
continue
|
||||
|
||||
if summary_linelength_warning_lower_limit <= len(commit_msg_lines[0]) \
|
||||
<= summary_linelength_warning_upper_limit:
|
||||
errors.append(
|
||||
output_api.PresubmitPromptWarning(
|
||||
commit_tag + "Your description summary should be on one line of " +
|
||||
str(summary_linelength_warning_lower_limit - 1) + " or less characters."))
|
||||
elif len(commit_msg_lines[0]) > summary_linelength_warning_upper_limit:
|
||||
errors.append(
|
||||
output_api.PresubmitError(
|
||||
commit_tag + "Please ensure that your description summary is on one line of " +
|
||||
str(summary_linelength_warning_lower_limit - 1) + " or less characters."))
|
||||
commit_msg_lines.pop(0) # get rid of description summary
|
||||
if len(commit_msg_lines) == 0:
|
||||
continue
|
||||
if not _IsLineBlank(commit_msg_lines[0]):
|
||||
errors.append(
|
||||
output_api.PresubmitError(commit_tag +
|
||||
'Please ensure the summary is only 1 line and '
|
||||
'there is 1 blank line between the summary '
|
||||
'and description body.'))
|
||||
else:
|
||||
commit_msg_lines.pop(0) # pop first blank line
|
||||
if len(commit_msg_lines) == 0:
|
||||
continue
|
||||
if _IsLineBlank(commit_msg_lines[0]):
|
||||
errors.append(
|
||||
output_api.PresubmitError(commit_tag +
|
||||
'Please ensure that there exists only 1 blank line '
|
||||
'between description summary and description body.'))
|
||||
# pop all the remaining blank lines between
|
||||
# description summary and description body
|
||||
_PopBlankLines(commit_msg_lines)
|
||||
|
||||
# loop through description body
|
||||
while len(commit_msg_lines) > 0:
|
||||
line = commit_msg_lines.pop(0)
|
||||
# lines starting with 4 spaces, quotes or lines without space(urls)
|
||||
# are exempt from length check
|
||||
if line.startswith(" ") or line.startswith("> ") or " " not in line:
|
||||
continue
|
||||
if len(line) > description_linelength_limit:
|
||||
errors.append(
|
||||
output_api.PresubmitError(
|
||||
commit_tag + 'Line ' + str(commit_msg_line_numbers[line]) +
|
||||
' is too long.\n' + '"' + line + '"\n' + 'Please wrap it to ' +
|
||||
str(description_linelength_limit) + ' characters. ' +
|
||||
"Lines without spaces or lines starting with 4 spaces are exempt."))
|
||||
break
|
||||
return errors
|
||||
|
||||
|
||||
def _CheckChangeHasBugField(input_api, output_api):
|
||||
"""Requires that the changelist have a Bug: field from a known project."""
|
||||
bugs = input_api.change.BugsFromDescription()
|
||||
if not bugs:
|
||||
return [
|
||||
output_api.PresubmitError('Please ensure that your description contains:\n'
|
||||
'"Bug: angleproject:[bug number]"\n'
|
||||
'directly above the Change-Id tag.')
|
||||
]
|
||||
|
||||
# The bug must be in the form of "project:number". None is also accepted, which is used by
|
||||
# rollers as well as in very minor changes.
|
||||
if len(bugs) == 1 and bugs[0] == 'None':
|
||||
return []
|
||||
|
||||
projects = [
|
||||
'angleproject:', 'chromium:', 'dawn:', 'fuchsia:', 'skia:', 'swiftshader:', 'tint:', 'b/'
|
||||
]
|
||||
bug_regex = re.compile(r"([a-z]+[:/])(\d+)")
|
||||
errors = []
|
||||
extra_help = None
|
||||
|
||||
for bug in bugs:
|
||||
if bug == 'None':
|
||||
errors.append(
|
||||
output_api.PresubmitError('Invalid bug tag "None" in presence of other bug tags.'))
|
||||
continue
|
||||
|
||||
match = re.match(bug_regex, bug)
|
||||
if match == None or bug != match.group(0) or match.group(1) not in projects:
|
||||
errors.append(output_api.PresubmitError('Incorrect bug tag "' + bug + '".'))
|
||||
if not extra_help:
|
||||
extra_help = output_api.PresubmitError('Acceptable format is:\n\n'
|
||||
' Bug: project:bugnumber\n\n'
|
||||
'Acceptable projects are:\n\n ' +
|
||||
'\n '.join(projects))
|
||||
|
||||
if extra_help:
|
||||
errors.append(extra_help)
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
def _CheckCodeGeneration(input_api, output_api):
|
||||
|
||||
class Msg(output_api.PresubmitError):
|
||||
"""Specialized error message"""
|
||||
|
||||
def __init__(self, message, **kwargs):
|
||||
super(output_api.PresubmitError, self).__init__(
|
||||
message,
|
||||
long_text='Please ensure your ANGLE repositiory is synced to tip-of-tree\n'
|
||||
'and all ANGLE DEPS are fully up-to-date by running gclient sync.\n'
|
||||
'\n'
|
||||
'If that fails, run scripts/run_code_generation.py to refresh generated hashes.\n'
|
||||
'\n'
|
||||
'If you are building ANGLE inside Chromium you must bootstrap ANGLE\n'
|
||||
'before gclient sync. See the DevSetup documentation for more details.\n',
|
||||
**kwargs)
|
||||
|
||||
code_gen_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
|
||||
'scripts/run_code_generation.py')
|
||||
cmd_name = 'run_code_generation'
|
||||
cmd = [input_api.python3_executable, code_gen_path, '--verify-no-dirty']
|
||||
test_cmd = input_api.Command(name=cmd_name, cmd=cmd, kwargs={}, message=Msg)
|
||||
if input_api.verbose:
|
||||
print('Running ' + cmd_name)
|
||||
return input_api.RunTests([test_cmd])
|
||||
|
||||
|
||||
# Taken directly from Chromium's PRESUBMIT.py
|
||||
def _CheckNewHeaderWithoutGnChange(input_api, output_api):
|
||||
"""Checks that newly added header files have corresponding GN changes.
|
||||
Note that this is only a heuristic. To be precise, run script:
|
||||
build/check_gn_headers.py.
|
||||
"""
|
||||
|
||||
def headers(f):
|
||||
return input_api.FilterSourceFile(f, files_to_check=(r'.+%s' % _HEADER_EXTENSIONS,))
|
||||
|
||||
new_headers = []
|
||||
for f in input_api.AffectedSourceFiles(headers):
|
||||
if f.Action() != 'A':
|
||||
continue
|
||||
new_headers.append(f.LocalPath())
|
||||
|
||||
def gn_files(f):
|
||||
return input_api.FilterSourceFile(f, files_to_check=(r'.+\.gn',))
|
||||
|
||||
all_gn_changed_contents = ''
|
||||
for f in input_api.AffectedSourceFiles(gn_files):
|
||||
for _, line in f.ChangedContents():
|
||||
all_gn_changed_contents += line
|
||||
|
||||
problems = []
|
||||
for header in new_headers:
|
||||
basename = input_api.os_path.basename(header)
|
||||
if basename not in all_gn_changed_contents:
|
||||
problems.append(header)
|
||||
|
||||
if problems:
|
||||
return [
|
||||
output_api.PresubmitPromptWarning(
|
||||
'Missing GN changes for new header files',
|
||||
items=sorted(problems),
|
||||
long_text='Please double check whether newly added header files need '
|
||||
'corresponding changes in gn or gni files.\nThis checking is only a '
|
||||
'heuristic. Run build/check_gn_headers.py to be precise.\n'
|
||||
'Read https://crbug.com/661774 for more info.')
|
||||
]
|
||||
return []
|
||||
|
||||
|
||||
def _CheckExportValidity(input_api, output_api):
|
||||
outdir = tempfile.mkdtemp()
|
||||
# shell=True is necessary on Windows, as otherwise subprocess fails to find
|
||||
# either 'gn' or 'vpython3' even if they are findable via PATH.
|
||||
use_shell = input_api.is_windows
|
||||
try:
|
||||
try:
|
||||
subprocess.check_output(['gn', 'gen', outdir], shell=use_shell)
|
||||
except subprocess.CalledProcessError as e:
|
||||
return [
|
||||
output_api.PresubmitError(
|
||||
'Unable to run gn gen for export_targets.py: %s' % e.output)
|
||||
]
|
||||
export_target_script = os.path.join(input_api.PresubmitLocalPath(), 'scripts',
|
||||
'export_targets.py')
|
||||
try:
|
||||
subprocess.check_output(
|
||||
['vpython3', export_target_script, outdir] + _PRIMARY_EXPORT_TARGETS,
|
||||
stderr=subprocess.STDOUT,
|
||||
shell=use_shell)
|
||||
except subprocess.CalledProcessError as e:
|
||||
if input_api.is_committing:
|
||||
return [output_api.PresubmitError('export_targets.py failed: %s' % e.output)]
|
||||
return [
|
||||
output_api.PresubmitPromptWarning(
|
||||
'export_targets.py failed, this may just be due to your local checkout: %s' %
|
||||
e.output)
|
||||
]
|
||||
return []
|
||||
finally:
|
||||
shutil.rmtree(outdir)
|
||||
|
||||
|
||||
def _CheckTabsInSourceFiles(input_api, output_api):
|
||||
"""Forbids tab characters in source files due to a WebKit repo requirement."""
|
||||
|
||||
def implementation_and_headers_including_third_party(f):
|
||||
# Check third_party files too, because WebKit's checks don't make exceptions.
|
||||
return input_api.FilterSourceFile(
|
||||
f,
|
||||
files_to_check=(r'.+%s' % _IMPLEMENTATION_AND_HEADER_EXTENSIONS,),
|
||||
files_to_skip=[f for f in input_api.DEFAULT_FILES_TO_SKIP if not "third_party" in f])
|
||||
|
||||
files_with_tabs = []
|
||||
for f in input_api.AffectedSourceFiles(implementation_and_headers_including_third_party):
|
||||
for (num, line) in f.ChangedContents():
|
||||
if '\t' in line:
|
||||
files_with_tabs.append(f)
|
||||
break
|
||||
|
||||
if files_with_tabs:
|
||||
return [
|
||||
output_api.PresubmitError(
|
||||
'Tab characters in source files.',
|
||||
items=sorted(files_with_tabs),
|
||||
long_text=
|
||||
'Tab characters are forbidden in ANGLE source files because WebKit\'s Subversion\n'
|
||||
'repository does not allow tab characters in source files.\n'
|
||||
'Please remove tab characters from these files.')
|
||||
]
|
||||
return []
|
||||
|
||||
|
||||
# https://stackoverflow.com/a/196392
|
||||
def is_ascii(s):
|
||||
return all(ord(c) < 128 for c in s)
|
||||
|
||||
|
||||
def _CheckNonAsciiInSourceFiles(input_api, output_api):
|
||||
"""Forbids non-ascii characters in source files."""
|
||||
|
||||
def implementation_and_headers(f):
|
||||
return input_api.FilterSourceFile(
|
||||
f, files_to_check=(r'.+%s' % _IMPLEMENTATION_AND_HEADER_EXTENSIONS,))
|
||||
|
||||
files_with_non_ascii = []
|
||||
for f in input_api.AffectedSourceFiles(implementation_and_headers):
|
||||
for (num, line) in f.ChangedContents():
|
||||
if not is_ascii(line):
|
||||
files_with_non_ascii.append("%s: %s" % (f, line))
|
||||
break
|
||||
|
||||
if files_with_non_ascii:
|
||||
return [
|
||||
output_api.PresubmitError(
|
||||
'Non-ASCII characters in source files.',
|
||||
items=sorted(files_with_non_ascii),
|
||||
long_text='Non-ASCII characters are forbidden in ANGLE source files.\n'
|
||||
'Please remove non-ASCII characters from these files.')
|
||||
]
|
||||
return []
|
||||
|
||||
|
||||
def _CheckCommentBeforeTestInTestFiles(input_api, output_api):
|
||||
"""Require a comment before TEST_P() and other tests."""
|
||||
|
||||
def test_files(f):
|
||||
return input_api.FilterSourceFile(
|
||||
f, files_to_check=(r'^src/tests/.+\.cpp$', r'^src/.+_unittest\.cpp$'))
|
||||
|
||||
tests_with_no_comment = []
|
||||
for f in input_api.AffectedSourceFiles(test_files):
|
||||
diff = f.GenerateScmDiff()
|
||||
last_line_was_comment = False
|
||||
for line in diff.splitlines():
|
||||
# Skip removed lines
|
||||
if line.startswith('-'):
|
||||
continue
|
||||
|
||||
new_line_is_comment = line.startswith(' //') or line.startswith('+//')
|
||||
new_line_is_test_declaration = (
|
||||
line.startswith('+TEST_P(') or line.startswith('+TEST(') or
|
||||
line.startswith('+TYPED_TEST('))
|
||||
|
||||
if new_line_is_test_declaration and not last_line_was_comment:
|
||||
tests_with_no_comment.append(line[1:])
|
||||
|
||||
last_line_was_comment = new_line_is_comment
|
||||
|
||||
if tests_with_no_comment:
|
||||
return [
|
||||
output_api.PresubmitError(
|
||||
'Tests without comment.',
|
||||
items=sorted(tests_with_no_comment),
|
||||
long_text='ANGLE requires a comment describing what a test does.')
|
||||
]
|
||||
return []
|
||||
|
||||
|
||||
def _CheckShaderVersionInShaderLangHeader(input_api, output_api):
|
||||
"""Requires an update to ANGLE_SH_VERSION when ShaderLang.h or ShaderVars.h change."""
|
||||
|
||||
def headers(f):
|
||||
return input_api.FilterSourceFile(
|
||||
f,
|
||||
files_to_check=(r'^include/GLSLANG/ShaderLang.h$', r'^include/GLSLANG/ShaderVars.h$'))
|
||||
|
||||
headers_changed = input_api.AffectedSourceFiles(headers)
|
||||
if len(headers_changed) == 0:
|
||||
return []
|
||||
|
||||
# Skip this check for reverts and rolls. Unlike
|
||||
# _CheckCommitMessageFormatting, relands are still checked because the
|
||||
# original change might have incremented the version correctly, but the
|
||||
# rebase over a new version could accidentally remove that (because another
|
||||
# change in the meantime identically incremented it).
|
||||
git_output = input_api.change.DescriptionText()
|
||||
multiple_commits = _SplitIntoMultipleCommits(git_output)
|
||||
for commit in multiple_commits:
|
||||
if commit.startswith('Revert') or commit.startswith('Roll'):
|
||||
return []
|
||||
|
||||
diffs = '\n'.join(f.GenerateScmDiff() for f in headers_changed)
|
||||
versions = dict(re.findall(r'^([-+])#define ANGLE_SH_VERSION\s+(\d+)', diffs, re.M))
|
||||
|
||||
if len(versions) != 2 or int(versions['+']) <= int(versions['-']):
|
||||
return [
|
||||
output_api.PresubmitError(
|
||||
'ANGLE_SH_VERSION should be incremented when ShaderLang.h or ShaderVars.h change.',
|
||||
)
|
||||
]
|
||||
return []
|
||||
|
||||
|
||||
def _CheckGClientExists(input_api, output_api, search_limit=None):
|
||||
presubmit_path = pathlib.Path(input_api.PresubmitLocalPath())
|
||||
|
||||
for current_path in itertools.chain([presubmit_path], presubmit_path.parents):
|
||||
gclient_path = current_path.joinpath('.gclient')
|
||||
if gclient_path.exists() and gclient_path.is_file():
|
||||
return []
|
||||
# search_limit parameter is used in unit tests to prevent searching all the way to root
|
||||
# directory for reproducibility.
|
||||
elif search_limit != None and current_path == search_limit:
|
||||
break
|
||||
|
||||
return [
|
||||
output_api.PresubmitError(
|
||||
'Missing .gclient file.',
|
||||
long_text=textwrap.fill(
|
||||
width=100,
|
||||
text='The top level directory of the repository must contain a .gclient file.'
|
||||
' You can follow the steps outlined in the link below to get set up for ANGLE'
|
||||
' development:') +
|
||||
'\n\nhttps://chromium.googlesource.com/angle/angle/+/refs/heads/main/doc/DevSetup.md')
|
||||
]
|
||||
|
||||
def CheckChangeOnUpload(input_api, output_api):
|
||||
results = []
|
||||
results.extend(input_api.canned_checks.CheckForCommitObjects(input_api, output_api))
|
||||
results.extend(_CheckTabsInSourceFiles(input_api, output_api))
|
||||
results.extend(_CheckNonAsciiInSourceFiles(input_api, output_api))
|
||||
results.extend(_CheckCommentBeforeTestInTestFiles(input_api, output_api))
|
||||
results.extend(_CheckShaderVersionInShaderLangHeader(input_api, output_api))
|
||||
results.extend(_CheckCodeGeneration(input_api, output_api))
|
||||
results.extend(_CheckChangeHasBugField(input_api, output_api))
|
||||
results.extend(input_api.canned_checks.CheckChangeHasDescription(input_api, output_api))
|
||||
results.extend(_CheckNewHeaderWithoutGnChange(input_api, output_api))
|
||||
results.extend(_CheckExportValidity(input_api, output_api))
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckPatchFormatted(
|
||||
input_api, output_api, result_factory=output_api.PresubmitError))
|
||||
results.extend(_CheckCommitMessageFormatting(input_api, output_api))
|
||||
results.extend(_CheckGClientExists(input_api, output_api))
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def CheckChangeOnCommit(input_api, output_api):
|
||||
return CheckChangeOnUpload(input_api, output_api)
|
||||
@@ -1,13 +0,0 @@
|
||||
Name: ANGLE
|
||||
URL: http://angleproject.org
|
||||
Version: unknown
|
||||
License: BSD
|
||||
License File: LICENSE
|
||||
Shipped: yes
|
||||
|
||||
Description:
|
||||
The goal of ANGLE is to allow users of multiple operating systems
|
||||
to seamlessly run WebGL and other OpenGL ES content by translating
|
||||
OpenGL ES API calls to one of the hardware-supported APIs available
|
||||
for that platform.
|
||||
|
||||
105
README.md
105
README.md
@@ -1,105 +0,0 @@
|
||||
# ANGLE - Almost Native Graphics Layer Engine
|
||||
|
||||
The goal of ANGLE is to allow users of multiple operating systems to seamlessly run WebGL and other
|
||||
OpenGL ES content by translating OpenGL ES API calls to one of the hardware-supported APIs available
|
||||
for that platform. ANGLE currently provides translation from OpenGL ES 2.0, 3.0 and 3.1 to Vulkan,
|
||||
desktop OpenGL, OpenGL ES, Direct3D 9, and Direct3D 11. Future plans include ES 3.2, translation to
|
||||
Metal and MacOS, Chrome OS, and Fuchsia support.
|
||||
|
||||
### Level of OpenGL ES support via backing renderers
|
||||
|
||||
| | Direct3D 9 | Direct3D 11 | Desktop GL | GL ES | Vulkan | Metal |
|
||||
|----------------|:-------------:|:----------------:|:--------------:|:-------------:|:-------------:|:-------------:|
|
||||
| OpenGL ES 2.0 | complete | complete | complete | complete | complete | complete |
|
||||
| OpenGL ES 3.0 | | complete | complete | complete | complete | complete |
|
||||
| OpenGL ES 3.1 | | [incomplete][ES31OnD3D] | complete | complete | complete | |
|
||||
| OpenGL ES 3.2 | | | in progress | in progress | in progress | |
|
||||
|
||||
Additionally, OpenGL ES 1.1 is implemented in the front-end using OpenGL ES 3.0 features. This
|
||||
version of the specification is thus supported on all platforms specified above that support OpenGL
|
||||
ES 3.0 with [known issues][ES1].
|
||||
|
||||
[ES31OnD3D]: doc/ES31StatusOnD3D11.md
|
||||
[ES1]: doc/ES1Status.md
|
||||
|
||||
### Platform support via backing renderers
|
||||
|
||||
| | Direct3D 9 | Direct3D 11 | Desktop GL | GL ES | Vulkan | Metal |
|
||||
|-------------:|:--------------:|:--------------:|:-------------:|:-----------:|:-----------:|:--------------------:|
|
||||
| Windows | complete | complete | complete | complete | complete | |
|
||||
| Linux | | | complete | | complete | |
|
||||
| Mac OS X | | | complete | | | complete [1] |
|
||||
| iOS | | | | | | complete [2] |
|
||||
| Chrome OS | | | | complete | planned | |
|
||||
| Android | | | | complete | complete | |
|
||||
| GGP (Stadia) | | | | | complete | |
|
||||
| Fuchsia | | | | | complete | |
|
||||
|
||||
[1] Metal is supported on macOS 10.14+
|
||||
|
||||
[2] Metal is supported on iOS 12+
|
||||
|
||||
ANGLE v1.0.772 was certified compliant by passing the OpenGL ES 2.0.3 conformance tests in October 2011.
|
||||
|
||||
ANGLE has received the following certifications with the Vulkan backend:
|
||||
* OpenGL ES 2.0: ANGLE 2.1.0.d46e2fb1e341 (Nov, 2019)
|
||||
* OpenGL ES 3.0: ANGLE 2.1.0.f18ff947360d (Feb, 2020)
|
||||
* OpenGL ES 3.1: ANGLE 2.1.0.f5dace0f1e57 (Jul, 2020)
|
||||
|
||||
ANGLE also provides an implementation of the EGL 1.5 specification.
|
||||
|
||||
ANGLE is used as the default WebGL backend for both Google Chrome and Mozilla Firefox on Windows
|
||||
platforms. Chrome uses ANGLE for all graphics rendering on Windows, including the accelerated
|
||||
Canvas2D implementation and the Native Client sandbox environment.
|
||||
|
||||
Portions of the ANGLE shader compiler are used as a shader validator and translator by WebGL
|
||||
implementations across multiple platforms. It is used on Mac OS X, Linux, and in mobile variants of
|
||||
the browsers. Having one shader validator helps to ensure that a consistent set of GLSL ES shaders
|
||||
are accepted across browsers and platforms. The shader translator can be used to translate shaders
|
||||
to other shading languages, and to optionally apply shader modifications to work around bugs or
|
||||
quirks in the native graphics drivers. The translator targets Desktop GLSL, Vulkan GLSL, Direct3D
|
||||
HLSL, and even ESSL for native GLES2 platforms.
|
||||
|
||||
## Sources
|
||||
|
||||
ANGLE repository is hosted by Chromium project and can be
|
||||
[browsed online](https://chromium.googlesource.com/angle/angle) or cloned with
|
||||
|
||||
git clone https://chromium.googlesource.com/angle/angle
|
||||
|
||||
|
||||
## Building
|
||||
|
||||
View the [Dev setup instructions](doc/DevSetup.md).
|
||||
|
||||
## Contributing
|
||||
|
||||
* Join our [Google group](https://groups.google.com/group/angleproject) to keep up to date.
|
||||
* Join us on [Slack](https://chromium.slack.com) in the #angle channel. You can
|
||||
follow the instructions on the [Chromium developer page](https://www.chromium.org/developers/slack)
|
||||
for the steps to join the Slack channel. For Googlers, please follow the
|
||||
instructions on this [document](https://docs.google.com/document/d/1wWmRm-heDDBIkNJnureDiRO7kqcRouY2lSXlO6N2z6M/edit?usp=sharing)
|
||||
to use your google or chromium email to join the Slack channel.
|
||||
* [File bugs](http://anglebug.com/new) in the [issue tracker](https://bugs.chromium.org/p/angleproject/issues/list) (preferably with an isolated test-case).
|
||||
* [Choose an ANGLE branch](doc/ChoosingANGLEBranch.md) to track in your own project.
|
||||
|
||||
|
||||
* Read ANGLE development [documentation](doc).
|
||||
* Look at [pending](https://chromium-review.googlesource.com/q/project:angle/angle+status:open)
|
||||
and [merged](https://chromium-review.googlesource.com/q/project:angle/angle+status:merged) changes.
|
||||
* Become a [code contributor](doc/ContributingCode.md).
|
||||
* Use ANGLE's [coding standard](doc/CodingStandard.md).
|
||||
* Learn how to [build ANGLE for Chromium development](doc/BuildingAngleForChromiumDevelopment.md).
|
||||
* Get help on [debugging ANGLE](doc/DebuggingTips.md).
|
||||
* Go through [ANGLE's orientation](doc/Orientation.md) and sift through [starter projects](https://bugs.chromium.org/p/angleproject/issues/list?q=Hotlist%3DStarterBug). If you decide to take on any task, write a comment so you can get in touch with us, and more importantly, set yourself as the "owner" of the bug. This avoids having multiple people accidentally working on the same issue.
|
||||
|
||||
|
||||
* Read about WebGL on the [Khronos WebGL Wiki](http://khronos.org/webgl/wiki/Main_Page).
|
||||
* Learn about the initial ANGLE implementation details in the [OpenGL Insights chapter on ANGLE](http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-ANGLE.pdf) (this is not the most up-to-date ANGLE implementation details, it is listed here for historical reference only) and this [ANGLE presentation](https://drive.google.com/file/d/0Bw29oYeC09QbbHoxNE5EUFh0RGs/view?usp=sharing&resourcekey=0-CNvGnQGgFSvbXgX--Y_Iyg).
|
||||
* Learn about the past, present, and future of the ANGLE implementation in [this presentation](https://docs.google.com/presentation/d/1CucIsdGVDmdTWRUbg68IxLE5jXwCb2y1E9YVhQo0thg/pub?start=false&loop=false).
|
||||
* Watch a [short presentation](https://youtu.be/QrIKdjmpmaA) on the Vulkan back-end.
|
||||
* Track the [dEQP test conformance](doc/dEQP-Charts.md)
|
||||
* Read design docs on the [Vulkan back-end](src/libANGLE/renderer/vulkan/README.md)
|
||||
* Read about ANGLE's [testing infrastructure](infra/README.md)
|
||||
* View information on ANGLE's [supported extensions](doc/ExtensionSupport.md)
|
||||
* If you use ANGLE in your own project, we'd love to hear about it!
|
||||
1056
SConstruct
1056
SConstruct
File diff suppressed because it is too large
Load Diff
25
WATCHLISTS
25
WATCHLISTS
@@ -1,25 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# Watchlist Rules
|
||||
# Refer: http://dev.chromium.org/developers/contributing-code/watchlists
|
||||
|
||||
# IMPORTANT: The regular expression filepath is tested against each path using
|
||||
# re.search, so it is not usually necessary to add .*.
|
||||
|
||||
{
|
||||
'WATCHLIST_DEFINITIONS': {
|
||||
'vulkan': {
|
||||
'filepath': 'src/libANGLE/renderer/vulkan/',
|
||||
},
|
||||
},
|
||||
|
||||
##############################################################################
|
||||
# Please keep alphabetical
|
||||
##############################################################################
|
||||
'WATCHLISTS': {
|
||||
'vulkan': ['cclao+angleWatchVk@google.com',
|
||||
'jmadill+watch@chromium.org'],
|
||||
},
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
[
|
||||
"src/common/third_party/xxhash",
|
||||
"src/libANGLE/renderer/vulkan/shaders/src/third_party/ffx_spd"
|
||||
]
|
||||
@@ -1,37 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2021 The ANGLE Project Authors. All rights reserved. Use of this
|
||||
source code is governed by a BSD-style license that can be found in the
|
||||
LICENSE file.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.android.angle">
|
||||
|
||||
<application android:allowBackup="false"
|
||||
android:label="com.android.angle"
|
||||
android:extractNativeLibs="false"
|
||||
android:forceQueryable="true"
|
||||
android:multiArch="true">
|
||||
|
||||
<activity android:name="com.android.angle.EmptyMainActivity"
|
||||
android:label="Empty Main Activity"
|
||||
android:visibleToInstantApps="true"
|
||||
android:launchMode="singleTask"
|
||||
android:exported="true">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.INFO"/>
|
||||
</intent-filter>
|
||||
|
||||
<!-- Indicate that this PKG is ANGLE. -->
|
||||
<intent-filter android:priority="1">
|
||||
<action android:name="android.app.action.ANGLE_FOR_ANDROID" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2018 The ANGLE Project Authors. All rights reserved. Use of this
|
||||
source code is governed by a BSD-style license that can be found in the
|
||||
LICENSE file.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="{{manifest_package|default('org.chromium.angle')}}">
|
||||
|
||||
<application android:label="Angle for Android"
|
||||
android:extractNativeLibs="{{extract_native_libs|default('false')}}"
|
||||
android:multiArch="true">
|
||||
</application>
|
||||
</manifest>
|
||||
@@ -1,2 +0,0 @@
|
||||
cnorthrop@google.com
|
||||
ianelliott@google.com
|
||||
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright 2023 The ANGLE Project Authors. All rights reserved. Use of this
|
||||
source code is governed by a BSD-style license that can be found in the
|
||||
LICENSE file.
|
||||
-->
|
||||
|
||||
<permissions>
|
||||
<privapp-permissions package="com.android.angle">
|
||||
<permission name="android.permission.WRITE_SECURE_SETTINGS"/>
|
||||
</privapp-permissions>
|
||||
</permissions>
|
||||
@@ -1,111 +0,0 @@
|
||||
# Copyright 2018 The Chromium 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("//build/config/android/rules.gni")
|
||||
import("../gni/angle.gni")
|
||||
|
||||
vulkan_validation_layers = [ "VkLayer_khronos_validation" ]
|
||||
|
||||
angle_libraries = [
|
||||
"libEGL",
|
||||
"libGLESv1_CM",
|
||||
"libGLESv2",
|
||||
"libfeature_support",
|
||||
]
|
||||
|
||||
if (enable_java_templates) {
|
||||
template("angle_apk") {
|
||||
manifest_target_name = "${target_name}__manifest"
|
||||
manifest_path =
|
||||
"${target_gen_dir}/${target_name}/android/AndroidManifest.xml"
|
||||
|
||||
jinja_template(manifest_target_name) {
|
||||
input = "${angle_root}/android/AndroidManifest.xml.jinja2"
|
||||
output = manifest_path
|
||||
variables = [
|
||||
"manifest_package=${invoker.package_name}",
|
||||
"extract_native_libs=${angle_extract_native_libs}",
|
||||
]
|
||||
}
|
||||
|
||||
android_assets("${invoker.package_name}_assets") {
|
||||
disable_compression = true
|
||||
sources = [ "src/feature_support_util/a4a_rules.json" ]
|
||||
}
|
||||
|
||||
android_apk(target_name) {
|
||||
forward_variables_from(invoker, "*")
|
||||
android_manifest = manifest_path
|
||||
android_manifest_dep = ":$manifest_target_name"
|
||||
version_code = invoker.version_code
|
||||
version_name = invoker.version_name
|
||||
min_sdk_version = 26
|
||||
target_sdk_version = 28
|
||||
deps = [ ":${invoker.package_name}_assets" ]
|
||||
if (symbol_level != 0) {
|
||||
deps += [ ":compressed_symbols" ]
|
||||
if (android_64bit_target_cpu &&
|
||||
defined(android_secondary_abi_toolchain)) {
|
||||
deps += [ ":compressed_symbols($android_secondary_abi_toolchain)" ]
|
||||
}
|
||||
}
|
||||
|
||||
if (android_64bit_target_cpu &&
|
||||
defined(android_secondary_abi_toolchain)) {
|
||||
if (symbol_level == 0) {
|
||||
secondary_abi_shared_libraries = []
|
||||
foreach(_library, angle_libraries) {
|
||||
secondary_abi_shared_libraries +=
|
||||
[ "$angle_root:${_library}($android_secondary_abi_toolchain)" ]
|
||||
}
|
||||
if (angle_enable_vulkan_validation_layers) {
|
||||
foreach(_layer, vulkan_validation_layers) {
|
||||
secondary_abi_shared_libraries +=
|
||||
[ "$angle_vulkan_validation_layers_dir:${_layer}" +
|
||||
"($android_secondary_abi_toolchain)" ]
|
||||
}
|
||||
}
|
||||
} else {
|
||||
_secondary_out_dir = get_label_info(
|
||||
":compressed_symbols($android_secondary_abi_toolchain)",
|
||||
"root_out_dir")
|
||||
secondary_abi_loadable_modules = []
|
||||
foreach(_library, angle_libraries) {
|
||||
secondary_abi_loadable_modules += [ "$_secondary_out_dir/lib.compressed/${_library}${angle_libs_suffix}${shlib_extension}" ]
|
||||
}
|
||||
if (angle_enable_vulkan_validation_layers) {
|
||||
foreach(_layer, vulkan_validation_layers) {
|
||||
secondary_abi_loadable_modules += [ "${_secondary_out_dir}/lib.compressed/lib${_layer}${shlib_extension}" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (symbol_level == 0) {
|
||||
shared_libraries = []
|
||||
foreach(_library, angle_libraries) {
|
||||
shared_libraries += [ "$angle_root:$_library" ]
|
||||
}
|
||||
if (angle_enable_vulkan_validation_layers) {
|
||||
foreach(_layer, vulkan_validation_layers) {
|
||||
shared_libraries +=
|
||||
[ "$angle_vulkan_validation_layers_dir:${_layer}" ]
|
||||
}
|
||||
}
|
||||
} else {
|
||||
loadable_modules = []
|
||||
foreach(_library, angle_libraries) {
|
||||
loadable_modules += [ "$root_out_dir/lib.compressed/${_library}${angle_libs_suffix}${shlib_extension}" ]
|
||||
}
|
||||
if (angle_enable_vulkan_validation_layers) {
|
||||
foreach(_layer, vulkan_validation_layers) {
|
||||
loadable_modules += [
|
||||
"$root_out_dir/lib.compressed/lib${_layer}${shlib_extension}",
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Copyright 2018 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# Generate library file with compressed symbols per Android build
|
||||
# process.
|
||||
# https://www.ece.villanova.edu/VECR/doc/gdb/MiniDebugInfo.html
|
||||
|
||||
import argparse
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument(
|
||||
'--objcopy', required=True, help='The objcopy binary to run', metavar='PATH')
|
||||
parser.add_argument('--nm', required=True, help='The nm binary to run', metavar='PATH')
|
||||
parser.add_argument('--strip', required=True, help='The strip binary to run', metavar='PATH')
|
||||
parser.add_argument(
|
||||
'--output', required=True, help='Final output shared object file', metavar='FILE')
|
||||
parser.add_argument(
|
||||
'--unstrippedsofile',
|
||||
required=True,
|
||||
help='Unstripped shared object file produced by linking command',
|
||||
metavar='FILE')
|
||||
args = parser.parse_args()
|
||||
|
||||
copy_cmd = ["cp", args.unstrippedsofile, args.output]
|
||||
result = subprocess.call(copy_cmd)
|
||||
|
||||
nm_cmd = subprocess.Popen([args.nm, '-D', args.output, '--format=posix', '--defined-only'],
|
||||
stdout=subprocess.PIPE)
|
||||
|
||||
awk_cmd = subprocess.Popen(['awk', '{ print $1}'], stdin=nm_cmd.stdout, stdout=subprocess.PIPE)
|
||||
|
||||
dynsym_out = open(args.output + '.dynsyms', 'w')
|
||||
sort_cmd = subprocess.Popen(['sort'], stdin=awk_cmd.stdout, stdout=dynsym_out)
|
||||
sort_cmd.wait()
|
||||
dynsym_out.close()
|
||||
|
||||
funcsyms_out = open(args.output + '.funcsyms', 'w')
|
||||
nm_cmd = subprocess.Popen([args.nm, args.output, '--format=posix', '--defined-only'],
|
||||
stdout=subprocess.PIPE)
|
||||
|
||||
awk_cmd = subprocess.Popen(['awk', '{ if ($2 == "T" || $2 == "t" || $2 == "D") print $1 }'],
|
||||
stdin=nm_cmd.stdout,
|
||||
stdout=subprocess.PIPE)
|
||||
|
||||
sort_cmd = subprocess.Popen(['sort'], stdin=awk_cmd.stdout, stdout=funcsyms_out)
|
||||
sort_cmd.wait()
|
||||
funcsyms_out.close()
|
||||
|
||||
keep_symbols = open(args.output + '.keep_symbols', 'w')
|
||||
comm_cmd = subprocess.Popen(
|
||||
['comm', '-13', args.output + '.dynsyms', args.output + '.funcsyms'], stdout=keep_symbols)
|
||||
comm_cmd.wait()
|
||||
|
||||
# Ensure that the keep_symbols file is not empty.
|
||||
keep_symbols.write("\n")
|
||||
keep_symbols.close()
|
||||
|
||||
objcopy_cmd = [args.objcopy, '--only-keep-debug', args.output, args.output + '.debug']
|
||||
subprocess.check_call(objcopy_cmd)
|
||||
|
||||
objcopy_cmd = [
|
||||
args.objcopy, '-S', '--remove-section', '.gdb_index', '--remove-section', '.comment',
|
||||
'--keep-symbols', args.output + '.keep_symbols', args.output + '.debug',
|
||||
args.output + '.mini_debuginfo'
|
||||
]
|
||||
subprocess.check_call(objcopy_cmd)
|
||||
|
||||
strip_cmd = [args.strip, '--strip-all', '-R', '.comment', args.output]
|
||||
subprocess.check_call(strip_cmd)
|
||||
|
||||
xz_cmd = ['xz', '-f', args.output + '.mini_debuginfo']
|
||||
subprocess.check_call(xz_cmd)
|
||||
|
||||
objcopy_cmd = [
|
||||
args.objcopy, '--add-section', '.gnu_debugdata=' + args.output + '.mini_debuginfo.xz',
|
||||
args.output
|
||||
]
|
||||
subprocess.check_call(objcopy_cmd)
|
||||
|
||||
# Clean out scratch files
|
||||
rm_cmd = [
|
||||
'rm', '-f', args.output + '.dynsyms', args.output + '.funcsyms',
|
||||
args.output + '.keep_symbols', args.output + '.debug', args.output + '.mini_debuginfo',
|
||||
args.output + '.mini_debuginfo.xz'
|
||||
]
|
||||
result = subprocess.call(rm_cmd)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
1
angle
Submodule
1
angle
Submodule
Submodule angle added at aaebda1c5a
1
build
1
build
Submodule build deleted from 3a0a70c754
@@ -1,25 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# Override for angle_root
|
||||
angle_root = "//"
|
||||
|
||||
# True if ANGLE can access build/, testing/ and other Chrome folders.
|
||||
angle_has_build = true
|
||||
|
||||
# Declares the maximum supported VulkanMemoryAllocator version by the client
|
||||
# in format AAABBBCCC, where AAA = major, BBB = minor, CCC = patch.
|
||||
# The VulkanMemoryAllocator version may be found in its CHANGELOG.md.
|
||||
angle_vma_version = 3000000
|
||||
|
||||
# Overrides for ANGLE's dependencies
|
||||
angle_abseil_cpp_dir = "//third_party/abseil-cpp"
|
||||
angle_glslang_dir = "//third_party/vulkan-deps/glslang/src"
|
||||
angle_googletest_dir = "//third_party/googletest/src"
|
||||
angle_jsoncpp_dir = "//third_party/jsoncpp"
|
||||
angle_libjpeg_turbo_dir = "//third_party/libjpeg_turbo"
|
||||
angle_libpng_dir = "//third_party/libpng"
|
||||
angle_spirv_headers_dir = "//third_party/vulkan-deps/spirv-headers/src"
|
||||
angle_spirv_tools_dir = "//third_party/vulkan-deps/spirv-tools/src"
|
||||
angle_vulkan_memory_allocator_dir = "//third_party/vulkan_memory_allocator"
|
||||
@@ -1,61 +0,0 @@
|
||||
# Copyright 2017 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
declare_args() {
|
||||
build_with_chromium = false
|
||||
ignore_elf32_limitations = true
|
||||
|
||||
use_system_xcode = ""
|
||||
|
||||
# If true, it assumes that //third_party/abseil-cpp is an available
|
||||
# dependency for googletest.
|
||||
gtest_enable_absl_printers = false
|
||||
}
|
||||
|
||||
if (host_os == "mac" && use_system_xcode == "") {
|
||||
_result = exec_script("//build/mac/should_use_hermetic_xcode.py",
|
||||
[ target_os ],
|
||||
"value")
|
||||
|
||||
assert(_result != 2,
|
||||
"Do not allow building targets with the default" +
|
||||
"hermetic toolchain if the minimum OS version is not met.")
|
||||
assert(_result != 3,
|
||||
"iOS does not support building with a hermetic toolchain. " +
|
||||
"Please install Xcode.")
|
||||
|
||||
use_system_xcode = _result != 1
|
||||
}
|
||||
|
||||
enable_java_templates = true
|
||||
|
||||
# Build with fewer Android dependencies
|
||||
limit_android_deps = true
|
||||
|
||||
# Standalone ANGLE is used in places that are extremely performance sensitive,
|
||||
# such as the system graphics driver on Android. ANGLE validates arguments at
|
||||
# the API boundary and assumes that all bounds, et cetera are valid elsewhere
|
||||
# in internal code.
|
||||
#
|
||||
# Unfortunately, this means the compiler cannot optimize out the vast majority
|
||||
# of hardening checks. To ensure performance remains competitive, drop the
|
||||
# libc++ hardening checks, since ANGLE already makes no security guarantees in
|
||||
# these situations.
|
||||
if (is_win) {
|
||||
# TODO(https://crbug.com/1418717): ANGLE uses Chromium's abseil-cpp directory.
|
||||
# Since Abseil does not mark symbols as exported, Chromium uses an alternate
|
||||
# approach to scrape the symbols that need to be exported and generates .def
|
||||
# files that the ANGLE build reuses.
|
||||
#
|
||||
# However, these symbol names include libc++ types, and libc++ hardening
|
||||
# affects ABI, so ANGLE and Chromium's libc++ hardening modes need to remain
|
||||
# in sync on Windows. This is a bit of a hack but "OK" since the performance
|
||||
# concerns for standalone ANGLE builds are not relevant on Windows.
|
||||
enable_safe_libcxx = true
|
||||
} else if (is_linux) {
|
||||
# https://anglebug.com/8040: turning off safe_libcxx breaks TSAN
|
||||
enable_safe_libcxx = true
|
||||
} else {
|
||||
enable_safe_libcxx = false
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# Paths to glslang dependencies in ANGLE
|
||||
glslang_spirv_tools_dir = "//third_party/vulkan-deps/spirv-tools/src"
|
||||
|
||||
# Reduce glslang's features to what the Vulkan backend of ANGLE uses. This both speeds up glslang's
|
||||
# initialization and reduces binary footprint.
|
||||
glslang_angle = true
|
||||
@@ -1,17 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# Override settings for third_party integration with Google Test.
|
||||
|
||||
# Exclude support for registering main function in multi-process tests.
|
||||
gtest_include_multiprocess = true
|
||||
|
||||
# Exclude support for platform-specific operations across unit tests.
|
||||
gtest_include_platform_test = true
|
||||
|
||||
# Exclude support for testing Objective C code on OS X and iOS.
|
||||
gtest_include_objc_support = true
|
||||
|
||||
# Exclude support for flushing coverage files on iOS.
|
||||
gtest_include_ios_coverage = true
|
||||
@@ -1,10 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# We are building inside ANGLE
|
||||
spirv_tools_standalone = false
|
||||
|
||||
# Paths to SPIRV-Tools dependencies in ANGLE
|
||||
spirv_tools_googletest_dir = "//third_party/googletest/src"
|
||||
spirv_tools_spirv_headers_dir = "//third_party/vulkan-deps/spirv-headers/src"
|
||||
@@ -1,9 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# We are building SwiftShader in ANGLE
|
||||
swiftshader_standalone = false
|
||||
|
||||
# Path to SwiftShader
|
||||
swiftshader_dir = "//third_party/SwiftShader"
|
||||
@@ -1,13 +0,0 @@
|
||||
# Copyright 2021 The ANGLE Project 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("//gni/angle.gni")
|
||||
|
||||
vulkan_headers_dir = angle_vulkan_headers_dir
|
||||
|
||||
vulkan_data_subdir = angle_data_dir
|
||||
vulkan_gen_subdir = "angle/vulkan"
|
||||
|
||||
vulkan_use_x11 = angle_use_x11
|
||||
vulkan_use_wayland = angle_use_wayland
|
||||
@@ -1,5 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project 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("//build_overrides/vulkan_common.gni")
|
||||
@@ -1,7 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project 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("//build_overrides/vulkan_common.gni")
|
||||
|
||||
vulkan_loader_shared = angle_shared_libvulkan
|
||||
@@ -1,5 +0,0 @@
|
||||
# Copyright 2021 The ANGLE Project 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("//build_overrides/vulkan_common.gni")
|
||||
@@ -1,5 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project 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("//build_overrides/vulkan_common.gni")
|
||||
@@ -1,5 +0,0 @@
|
||||
# Copyright 2023 The ANGLE Project 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("//build_overrides/vulkan_common.gni")
|
||||
@@ -1,11 +0,0 @@
|
||||
# Copyright 2019 The ANGLE Project 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("//build_overrides/vulkan_common.gni")
|
||||
|
||||
vulkan_utility_libraries_dir =
|
||||
"//third_party/vulkan-deps/vulkan-utility-libraries/src"
|
||||
vvl_spirv_tools_dir = "//third_party/vulkan-deps/spirv-tools/src"
|
||||
vvl_spirv_headers_dir = "//third_party/vulkan-deps/spirv-headers/src"
|
||||
vvl_glslang_dir = "//third_party/vulkan-deps/glslang/src"
|
||||
@@ -1,11 +0,0 @@
|
||||
# Copyright 2022 The ANGLE Project 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("//gni/angle.gni")
|
||||
|
||||
# Path to Wayland sources
|
||||
wayland_dir = angle_wayland_dir
|
||||
|
||||
# ANGLE standalone has no Wayland GN
|
||||
wayland_gn_dir = ""
|
||||
Submodule buildtools deleted from d53d0131e2
@@ -1,6 +0,0 @@
|
||||
# This file is used by git cl to get repository specific information.
|
||||
CODE_REVIEW_SERVER: https://chromium-review.googlesource.com
|
||||
GERRIT_HOST: True
|
||||
TRYSERVER_GERRIT_URL: https://chromium-review.googlesource.com
|
||||
GERRIT_SQUASH_UPLOADS: False
|
||||
FORMAT_FULL_BY_DEFAULT: True
|
||||
@@ -1,15 +0,0 @@
|
||||
# 64-bit Safety In the Compiler
|
||||
|
||||
An issue that has arisen recently for contributors making changes to the GLSL ES
|
||||
grammar files has been that certain versions of flex, the lexer on which ANGLE
|
||||
relies, produce outputs which are not safe in 64-bit builds.
|
||||
|
||||
To address this issue, ANGLE has added a step to its generation scripts to apply
|
||||
64-bit safety fixes to newly regenerated outputs. This should be unnoticeable to
|
||||
developers invoking flex via the generate\_parser.sh scripts in the relevant
|
||||
compiler directories, as the fixes will be applied by the patch utility as part
|
||||
of that script.
|
||||
|
||||
When making code contributions that affect the grammar files, please ensure that
|
||||
you've generated the outputs using the script, to make certain that the 64-bit
|
||||
safety fixes are applied.
|
||||
@@ -1,46 +0,0 @@
|
||||
# Introduction
|
||||
|
||||
This page describes how to add new extensions to ANGLE.
|
||||
|
||||
# Adding EGL extensions
|
||||
|
||||
Note: see also [anglebug.com/2621](http://anglebug.com/2621), linked
|
||||
from the [starter project](Starter-Projects.md) doc, to simplify some
|
||||
of these steps.
|
||||
|
||||
For extensions requiring new entry points:
|
||||
|
||||
* Add the extension xml to
|
||||
[scripts/egl_angle_ext.xml](../scripts/egl_angle_ext.xml) .
|
||||
|
||||
* Note the prototypes for the new entry points must be added to the
|
||||
top of the file, and the functions themselves grouped under the
|
||||
extension name to the bottom of the file.
|
||||
|
||||
* Modify [scripts/registry_xml.py](../scripts/registry_xml.py) to add
|
||||
the new extension as needed.
|
||||
|
||||
* Run
|
||||
[scripts/run_code_generation.py](../scripts/run_code_generation.py)
|
||||
.
|
||||
|
||||
* The entry point itself goes in
|
||||
[entry_points_egl_ext.h](../src/libGLESv2/entry_points_egl_ext.h)
|
||||
and
|
||||
[entry_points_egl_ext.cpp](../src/libGLESv2/entry_points_egl_ext.cpp)
|
||||
.
|
||||
|
||||
* Add the new function to [libEGL.cpp](../src/libEGL/libEGL.cpp) and
|
||||
[libEGL.def](../src/libEGL/libEGL.def) .
|
||||
|
||||
* Update [eglext_angle.h](../include/EGL/eglext_angle.h) with the new
|
||||
entry points and/or enums.
|
||||
|
||||
* Add members to the appropriate Extensions struct in
|
||||
[Caps.h](../src/libANGLE/Caps.h) and
|
||||
[Caps.cpp](../src/libANGLE/Caps.cpp) .
|
||||
|
||||
* Initialize extension availability in the `Display` subclass's
|
||||
`generateExtensions` method for displays that can support the
|
||||
extension; for example,
|
||||
[DisplayCGL](../src/libANGLE/renderer/gl/cgl/DisplayCGL.mm).
|
||||
@@ -1,97 +0,0 @@
|
||||
# How to Branch and Roll Chromium's ANGLE Dependency
|
||||
|
||||
ANGLE provides an implementation of OpenGL ES on top of other APIs (e.g. DirectX11, Vulkan). ANGLE
|
||||
uses (i.e. depends upon) other third-party software that comes from different repositories. ANGLE specifies
|
||||
its dependencies on a specific version of each of these other repositories in the [ANGLE DEPS file](https://chromium.googlesource.com/angle/angle/+/main/DEPS).
|
||||
|
||||
Chromium relies upon ANGLE for hardware accelerated rendering and WebGL support. Chromium similarly
|
||||
specifies its dependency on a specific version of ANGLE in the [Chromium repository's src/DEPS file](http://src.chromium.org/viewvc/chrome/trunk/src/DEPS).
|
||||
|
||||
This document describes how to update those dependencies, and, if necessary, create an ANGLE branch
|
||||
to correspond to a branched release of Chrome.
|
||||
|
||||
ANGLE's commit queue also runs browser-level tests which are hosted in
|
||||
the Chromium repository. To reduce the chance of a Chromium-side
|
||||
change breaking ANGLE's CQ, the version of Chromium against which
|
||||
ANGLE changes is also snapshotted, and rolled forward into ANGLE with
|
||||
appropriate testing.
|
||||
|
||||
## Autorollers
|
||||
|
||||
At present, autorollers manage both the ANGLE roll into Chromium, and
|
||||
the Chromium roll into ANGLE. There is also an autoroller for ANGLE into [Android AOSP](https://android.googlesource.com/platform/external/angle/).
|
||||
All of the ANGLE-related autorollers are documented in the [ANGLE Wrangling documentation](../infra/ANGLEWrangling.md#the-auto-rollers).
|
||||
|
||||
## Manually rolling DEPS
|
||||
|
||||
As mentioned above, dependencies are encoded in `DEPS` files. The process to update a given
|
||||
dependency is as follows:
|
||||
|
||||
* Find the appropriate line in the relevant `DEPS` file that defines the dependency
|
||||
* Change the [git SHA-1 revision number](http://git-scm.com/book/ch6-1.html) to be that of the commit
|
||||
on which to depend upon (Note: use the full SHA-1, not a
|
||||
shortened version)
|
||||
* You can find the SHA-1 for a particular commit with `git log` on the appropriate branch of the
|
||||
repository, or via a public repository viewer
|
||||
* If using the [ANGLE public repository viewer](https://chromium.googlesource.com/angle/angle), you will need to select the branch whose log you
|
||||
wish to view from the list on the left-hand side, and then click on the "tree" link at the top of
|
||||
the resulting page. Alternatively, you can navigate to
|
||||
`https://chromium.googlesource.com/angle/angle/+/<branch name>/` --
|
||||
including the terminating forward slash. (e.g.
|
||||
`https://chromium.googlesource.com/angle/angle/+/main/`)
|
||||
|
||||
### Rolling Vulkan Memory Allocator (VMA)
|
||||
|
||||
ANGLE and other Google projects (e.g. Skia, Chrome) use the open-source [Vulkan Memory Allocator][vma-upstream] (VMA)
|
||||
library. As with with other external repositories, these projects do not directly use the [upstream Vulkan Memory Allocator][vma-upstream] repository.
|
||||
Instead, a [Google-local repository][vma-chrome] is used, which contains Google-local changes and fixes (e.g. changes
|
||||
to `BUILD.gn`). This Google-local repository repository contains the following key branches:
|
||||
|
||||
- `upstream/master` is automatically mirrored with the contents of the [upstream VMA][vma-upstream] repository
|
||||
- `main` is manually curated by Google, with a combination of upstream and Google-local changes
|
||||
|
||||
ANGLE's `DEPS` file points to a git SHA-1 revision of the `main` branch.
|
||||
|
||||
Manual rolls of the `main` branch currently involve rebasing all of the Google-local changes on top of newer upstream changes. The current process (done in 2022) is to:
|
||||
|
||||
* Revert all of the Google-local changes (i.e. with a single commit)
|
||||
* Merge or cherry-pick all of the upstream changes
|
||||
* Cherry-pick the Google-local changes on top
|
||||
* Note: it may be possible to simply merge future upstream changes directly, without reverting the Google-local changes
|
||||
|
||||
Manual rolls of which SHA-1 revision the ANGLE's `DEPS` file points to is done via the process
|
||||
outlined above. Within an ANGLE build, you can navigate to the `third_party/vulkan_memory_allocator`
|
||||
directory, check out the `main` branch, and use `git log` to select the desired Git revision.
|
||||
**Please note** that cross-project coordination may be required when rolling VMA, as some projects (e.g. Chrome) builds itself with a single VMA version across Chrome, ANGLE, and Skia.
|
||||
|
||||
[vma-upstream]: https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
|
||||
[vma-chrome]: https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
|
||||
|
||||
Note: When ANGLE is AutoRolled to the Android AOSP source tree, Google-local
|
||||
changes to the VMA `BUILD.gn` file will be converted to the ANGLE `Android.bp` file.
|
||||
|
||||
## Branching ANGLE
|
||||
|
||||
Sometimes, individual changes to ANGLE are needed for a release of Chrome which
|
||||
has already been branched. If this is the case, a branch of ANGLE should be
|
||||
created to correspond to the Chrome release version, so that Chrome may
|
||||
incorporate only these changes, and not everything that has been committed since
|
||||
the version on which Chrome depended at branch time. **Please note: Only ANGLE
|
||||
admins can create a new branch.** To create a branch of ANGLE for a branched
|
||||
Chrome release:
|
||||
|
||||
* Determine what the ANGLE dependency is for the Chrome release
|
||||
by checking the DEPS file for that branch.
|
||||
* Check out this commit as a new branch in your local repository.
|
||||
* e.g., for [the Chrome 34 release at
|
||||
chrome/branches/1847](http://src.chromium.org/viewvc/chrome/branches/1847/src/DEPS),
|
||||
the ANGLE version is 4df02c1ed5e97dd54576b06964b1da67ea30238e. To
|
||||
check this commit out locally and create a new branch named 'mybranch'
|
||||
from this commit, use: ```git checkout -b mybranch
|
||||
4df02c1ed5e97dd54576b06964b1da67ea30238e```
|
||||
* To create this new branch in the public repository, you'll need to push the
|
||||
branch to the special Gerrit reference location, 'refs/heads/<branch name>'. You
|
||||
must be an ANGLE administrator to be able to push this new branch.
|
||||
* e.g., to use your local 'mybranch' to create a branch in the public repository called
|
||||
'chrome\_m34', use: ```git push origin mybranch:refs/heads/chrome_m34```
|
||||
* The naming convention that ANGLE uses for its release-dedicated branches is 'chrome\_m##'.
|
||||
@@ -1,122 +0,0 @@
|
||||
# Introduction
|
||||
|
||||
Since Direct3D 9 only supports buffers that either contain vertex or index data,
|
||||
and OpenGL buffers can contain both, ANGLE waits till a draw call is issued to
|
||||
determine which resources to create/update. The generic implementation 'streams'
|
||||
the data into global vertex and index buffers. This streaming buffer
|
||||
implementation works in all circumstances, but does not offer optimal
|
||||
performance. When buffer data isn't updated, there's no reason to copy the data
|
||||
again. For these cases a 'static' buffer implementation is used.
|
||||
|
||||
The OpenGL ES 2.0 glBufferData() function allows to specify a usage hint
|
||||
parameter (GL\_STREAM\_DRAW, GL\_DYNAMIC\_DRAW or GL\_STATIC\_DRAW). Both
|
||||
GL\_STREAM\_DRAW and GL\_DYNAMIC\_DRAW use the streaming buffer implementation.
|
||||
With the GL\_STATIC\_DRAW hint, ANGLE will attempt to use the static buffer
|
||||
implementation. If you update the buffer data after it has already been used in
|
||||
a draw call, it falls back to the streaming buffer implementation, because
|
||||
updating static ones would involve creating new ones, which is slower than
|
||||
updating streaming ones (more on this later).
|
||||
|
||||
Because some applications use GL\_STREAM\_DRAW or GL\_DYNAMIC\_DRAW even when
|
||||
the data is not or very infrequently updated, ANGLE also has a heuristic to
|
||||
promote buffers to use the static implementation.
|
||||
|
||||
# Streaming buffers
|
||||
|
||||
The streaming buffers implementation uses one Context-global vertex buffer
|
||||
(VertexDataManager::mStreamingBuffer) and two index buffers
|
||||
(IndexDataManager::mStreamingBufferShort and
|
||||
IndexDataManager::mStreamingBufferInt). The streaming behavior is achieved by
|
||||
writing new data behind previously written data (i.e. without overwriting old
|
||||
data). Direct3D 9 allows to efficiently update vertex and index buffers when
|
||||
you're not reading or overwriting anything (it won't stall waiting for the GPU
|
||||
finish using it).
|
||||
|
||||
When the end of these streaming buffers is reached, they are 'recycled' by
|
||||
discarding their content. D3D9 will still keep a copy of the data that's in use,
|
||||
so this recycling efficiently renames the driver level buffers. ANGLE can then
|
||||
write new data to the beginning of the vertex or index buffer.
|
||||
|
||||
The ArrayVertexBuffer::mWritePosition variable holds the current end position of
|
||||
the last data that was written. StreamingVertexBuffer::reserveRequiredSpace()
|
||||
allocates space to write the data, and StreamingVertexBuffer::map() actually
|
||||
locks the D3D buffer and updates the write position. Similar for index buffers.
|
||||
|
||||
# Static buffers
|
||||
|
||||
Each GL buffer object can have a corresponding static vertex or index buffer
|
||||
(Buffer::mVertexBuffer and Buffer::mIndexBuffer). When a GL buffer with static
|
||||
usage is used in a draw call for the first time, all of its data is converted to
|
||||
a D3D vertex or index buffer, based on the attribute or index formats
|
||||
respectively. If a subsequent draw call uses different formats, the static
|
||||
buffer is invalidated (deleted) and the streaming buffer implementation is used
|
||||
for this buffer object instead. So for optimal performance it's important to
|
||||
store only a single format of vertices or indices in a buffer. This is highly
|
||||
typical, and even when in some cases it falls back to the streaming buffer
|
||||
implementation the performance isn't bad at all.
|
||||
|
||||
The StreamingVertexBuffer and StaticVertexBuffer classes share a common base
|
||||
class, ArrayVertexBuffer. StaticVertexBuffer also has access to the write
|
||||
position, but it's used only for the initial conversion of the data. So the
|
||||
interfaces of both classes are not that different. Static buffers have an exact
|
||||
size though, and can't be changed afterwards (streaming buffers can grow to
|
||||
handle draw calls which use more data, and avoid excessive recycling).
|
||||
StaticVertexBuffer has a lookupAttribute() method to retrieve the location of a
|
||||
certain attribute (this is also used to verify that the formats haven't changed,
|
||||
which would result in invalidating the static buffer). The descriptions of all
|
||||
the attribute formats a static buffer contains are stored in the
|
||||
StaticVertexBuffer::mCache vector.
|
||||
|
||||
StaticIndexBuffer also caches information about what's stored in them, namely
|
||||
the minimum and maximum value for certain ranges of indices. This information is
|
||||
required by the Direct3D 9 draw calls, and is also used to know the range of
|
||||
vertices that need to be copied to the streaming vertex buffer in case it needs
|
||||
to be used (e.g. it is not uncommon to have a buffer with static vertex position
|
||||
data and a buffer with streaming texture coordinate data for skinning).
|
||||
|
||||
# Constant attributes
|
||||
|
||||
Aside from using array buffers to feed attribute data to the vertex shader,
|
||||
OpenGL also supports attributes which remain constant for all vertices used in a
|
||||
draw call. Direct3D 9 doesn't have a similar concept, at least not explicitly.
|
||||
|
||||
Constant attributes are implemented using separate (static) vertex buffers,
|
||||
and uses a stride of 0 to ensure that every vertex retrieves the same data.
|
||||
Using a stride of 0 is not possible with streaming buffers because on some
|
||||
hardware it is incompatible with the D3DUSAGE\_DYNAMIC flag. We found that with
|
||||
static usage, all hardware tested so far can handle stride 0 fine.
|
||||
|
||||
This functionality was implemented in a ConstantVertexBuffer class, and it
|
||||
integrates nicely with the rest of the static buffer implementation.
|
||||
|
||||
# Line loops
|
||||
|
||||
Direct3D 9 does not support the 'line loop' primitive type directly. This is
|
||||
implemented by drawing the 'closing' line segment separately, constructing a
|
||||
tiny temporary index buffer connecting the last and first vertex.
|
||||
|
||||
# Putting it all together
|
||||
|
||||
glDrawElements() calls IndexDataManager::prepareIndexData() to retrieve a
|
||||
Direct3D index buffer containing the necessary data. If an element array is used
|
||||
(i.e. a buffer object), it has static usage, and it hasn't been invalidated, the
|
||||
GL buffer's static D3D index buffer will be returned. Else the updated streaming
|
||||
index buffer is returned, as well as the index offset (write position) where the
|
||||
new data is located. When prepareIndexData() does find a static index buffer,
|
||||
but it's empty, it means the GL buffer's data hasn't been converted and stored
|
||||
in the D3D index buffer yet. So in the convertIndices() call it will convert the
|
||||
entire buffer. prepareIndexData() will also look up the min/max value of a range
|
||||
of indices, or computes it when not already in the static buffer or when a
|
||||
streaming buffer is used.
|
||||
|
||||
Similarly, both glDrawElements() and glDrawArrays() both call
|
||||
VertexDataManager::prepareVertexData() to retrieve a set of Direct3D vertex
|
||||
buffers and their translated format and offset information. It's implementation
|
||||
is more complicated than prepareIndexData() because buffer objects can contain
|
||||
multiple vertex attributes, and multiple buffers can be used as input to the
|
||||
vertex shader. So first it accumulates how much storage space is required for
|
||||
each of the buffers in use. For all static non-empty buffers in use, it
|
||||
determines whether the stored attributes still match what is required by the
|
||||
draw call, and invalidates them if not (at which point more space is allocated
|
||||
in the streaming buffer). Converting the GL buffer object's data into D3D
|
||||
compatible vertex formats is still done by specialized template functions.
|
||||
@@ -1,66 +0,0 @@
|
||||
# How to build ANGLE in Chromium for dev
|
||||
|
||||
## Introduction
|
||||
|
||||
On Windows, Linux, and Mac ANGLE now builds most core components cross platform, including the shader validator and translator as well as the graphics API translator. These parts can be built and tested inside a Chromium checkout.
|
||||
|
||||
ANGLE also includes some sample applications and a few other targets that don't build on Chromium. These steps describe how to build such targets within a Chromium checkout.
|
||||
|
||||
Prerequisite Steps:
|
||||
|
||||
* Checkout and build [Chromium](http://dev.chromium.org/Home).
|
||||
* To setup run these commands (note similarity to [DevSetup](DevSetup.md)):
|
||||
|
||||
## Standalone ANGLE inside Chromium
|
||||
|
||||
* To sync all standalone dependencies run:
|
||||
|
||||
```bash
|
||||
cd src/third_party/angle
|
||||
python3 scripts/bootstrap.py
|
||||
gclient sync
|
||||
```
|
||||
|
||||
* To generate ANGLE standalone build files run:
|
||||
|
||||
```bash
|
||||
cd src/third_party/angle
|
||||
gn gen out/Debug
|
||||
```
|
||||
|
||||
* To build:
|
||||
|
||||
```bash
|
||||
cd src/third_party/angle
|
||||
ninja -j 10 -k1 -C out/Debug
|
||||
```
|
||||
|
||||
* For example, `ninja -j 10 -k1 -C out/Debug angle_gles2_deqp_tests`
|
||||
* To run a sample application: `./out/Debug/hello_triangle`
|
||||
* To go back to the Chromium-managed version, remove `third_party/angle/.gclient`.
|
||||
|
||||
## Working with ANGLE in Chromium
|
||||
|
||||
You will also want to work with a local version of ANGLE instead of the version that is pulled in by Chromium's [DEPS](https://chromium.googlesource.com/chromium/src/+/main/DEPS) file. To do this do the following:
|
||||
|
||||
* cd to `chromium/`. One directory above `chromium/src`. Add this to `chromium/.gclient`:
|
||||
|
||||
```python
|
||||
solutions = [
|
||||
{
|
||||
# ...
|
||||
u'custom_deps':
|
||||
{
|
||||
"src/third_party/angle": None,
|
||||
},
|
||||
},
|
||||
]
|
||||
```
|
||||
|
||||
You will have full control over your ANGLE workspace and are responsible for running all git commands (pull, rebase, etc.) for managing your branches.
|
||||
|
||||
If you decide you need to go back to the DEPS version of ANGLE:
|
||||
|
||||
* Comment out or remove the `src/third_party/angle` line in your `custom_deps` in `chomium/.gclient`.
|
||||
* Se the ANGLE workspace to the version specified in Chromium's DEPS. Ensure there are no modified or new files.
|
||||
* `gclient sync` your Chromium workspace.
|
||||
@@ -1,245 +0,0 @@
|
||||
# ANGLE OpenGL Frame Capture and Replay
|
||||
|
||||
ANGLE currently supports a limited OpenGL capture and replay framework.
|
||||
|
||||
Limitations:
|
||||
|
||||
* GLES capture has many unimplemented functions.
|
||||
* EGL capture and replay is not yet supported.
|
||||
* Mid-execution capture is supported with the Vulkan back-end.
|
||||
* Mid-execution capture has many unimplemented features.
|
||||
* Capture and replay is currently only tested on desktop platforms.
|
||||
* Binary replay is unimplemented. CPP replay is supported.
|
||||
|
||||
## Capturing and replaying an application
|
||||
|
||||
To build ANGLE with capture and replay enabled update your GN args:
|
||||
|
||||
```
|
||||
angle_with_capture_by_default = true
|
||||
```
|
||||
|
||||
Once built with capture enabled by default, ANGLE supports capturing OpenGL ES calls to CPP replay
|
||||
files. To enable capture, set the `ANGLE_CAPTURE_FRAME_START` and `ANGLE_CAPTURE_FRAME_END`
|
||||
environment variables to define a capture frame range, or use the [capture trigger
|
||||
property][CaptureTrigger] on Android. By default the replay will be stored in the current working
|
||||
directory. The capture files will be named according to the pattern
|
||||
`angle_capture_context{id}_frame{n}.cpp`. Each GL Context currently has its own replay sources.
|
||||
ANGLE will write out data binary blobs for large Texture or Buffer contents to
|
||||
`angle_capture_context{id}_frame{n}.angledata`. Replay programs must be able to load data from the
|
||||
corresponding `angledata` files.
|
||||
|
||||
## Controlling Frame Capture
|
||||
|
||||
Some simple environment variables control frame capture:
|
||||
|
||||
* `ANGLE_CAPTURE_ENABLED`:
|
||||
* Set to `0` to disable capture entirely. Default is `1`.
|
||||
* `ANGLE_CAPTURE_COMPRESSION`:
|
||||
* Set to `0` to disable capture compression. Default is `1`.
|
||||
* `ANGLE_CAPTURE_OUT_DIR=<path>`:
|
||||
* Can specify an alternate replay output directory.
|
||||
* Example: `ANGLE_CAPTURE_OUT_DIR=samples/capture_replay`. Default is the CWD.
|
||||
* `ANGLE_CAPTURE_FRAME_START=<n>`:
|
||||
* Uses mid-execution capture to write "Setup" functions that starts a Context at frame `n`.
|
||||
* Example: `ANGLE_CAPTURE_FRAME_START=2`. Default is `0`.
|
||||
* `ANGLE_CAPTURE_FRAME_END=<n>`:
|
||||
* Example: `ANGLE_CAPTURE_FRAME_END=4`. Default is `0` which disables capture.
|
||||
* `ANGLE_CAPTURE_LABEL=<label>`:
|
||||
* When specified, files and functions will be labeled uniquely.
|
||||
* Example: `ANGLE_CAPTURE_LABEL=foo`
|
||||
* Results in filenames like this:
|
||||
```
|
||||
foo.angledata.gz
|
||||
foo_context1_001.cpp
|
||||
foo_context1_002.cpp
|
||||
foo_context1_003.cpp
|
||||
foo_context1.cpp
|
||||
foo_context1.h
|
||||
foo.json
|
||||
foo_shared.cpp
|
||||
...
|
||||
```
|
||||
* `ANGLE_CAPTURE_SERIALIZE_STATE`:
|
||||
* Set to `1` to enable GL state serialization. Default is `0`.
|
||||
|
||||
A good way to test out the capture is to use environment variables in conjunction with the sample
|
||||
template. For example:
|
||||
|
||||
```
|
||||
$ ANGLE_CAPTURE_FRAME_END=4 ANGLE_CAPTURE_OUT_DIR=samples/capture_replay out/Debug/simple_texture_2d --use-angle=vulkan
|
||||
```
|
||||
|
||||
## Running the capture_replay sample (desktop only)
|
||||
|
||||
To run a sample replay you can use a template located in
|
||||
[samples/capture_replay](../samples/capture_replay). First run your sample and ensure all capture
|
||||
files are written to `samples/capture_replay`. You can conveniently use `ANGLE_CAPTURE_OUT_DIR`.
|
||||
Make sure `ANGLE_CAPTURE_LABEL` is left unset during capture to use the default file names.
|
||||
Then enable the `capture_replay_sample` via `gn args`:
|
||||
|
||||
```
|
||||
angle_build_capture_replay_sample = true
|
||||
```
|
||||
|
||||
See [samples/BUILD.gn](../samples/BUILD.gn) for details. Then build and run your replay sample:
|
||||
|
||||
```
|
||||
$ autoninja -C out/Debug capture_replay_sample
|
||||
$ out/Debug/capture_replay_sample
|
||||
```
|
||||
|
||||
## Running a perf test replay (all platforms, including Android)
|
||||
|
||||
To run your capture on any platform (Windows, Linux, Android, Mac (untested)), you'll need to
|
||||
compile it as part of ANGLE's Trace Replay harness, which is part of `angle_perftests`.
|
||||
|
||||
Create a folder under `src/tests/restricted_traces` that matches the `ANGLE_CAPTURE_LABEL` you
|
||||
used above.
|
||||
|
||||
Place all the trace output files into it. For example, if the label was `desktop_test`:
|
||||
```
|
||||
src/tests/restricted_traces$ ls -1 desktop_test/
|
||||
desktop_test.angledata.gz
|
||||
desktop_test_context1_001.cpp
|
||||
desktop_test_context1_002.cpp
|
||||
desktop_test_context1_003.cpp
|
||||
desktop_test_context1.cpp
|
||||
desktop_test_context1.h
|
||||
desktop_test.json
|
||||
desktop_test_shared.cpp
|
||||
```
|
||||
Then add the label of your trace to
|
||||
[restricted_traces.json](../src/tests/restricted_traces/restricted_traces.json).
|
||||
Note it includes a version with the string. Just use the number `1` for local changes.
|
||||
```
|
||||
"dead_trigger_2 1",
|
||||
+ "desktop_test 1",
|
||||
"disney_tsum_tsum 5",
|
||||
```
|
||||
Now you should be able to compile and run the perf test including your trace:
|
||||
```
|
||||
autoninja -C out/Debug angle_perftests
|
||||
ANGLE_CAPTURE_ENABLED=0 out/Debug/angle_perftests --gtest_filter="*desktop_test*" --verbose
|
||||
```
|
||||
## Capturing an Android application
|
||||
|
||||
In order to capture on Android, the following additional steps must be taken. These steps
|
||||
presume you've built and installed the ANGLE APK with capture enabled, and selected ANGLE
|
||||
as the GLES driver for your application.
|
||||
|
||||
1. Create the output directory
|
||||
|
||||
Determine your package name:
|
||||
```
|
||||
export PACKAGE_NAME com.android.gl2jni
|
||||
```
|
||||
Then create an output directory that it can write to:
|
||||
```
|
||||
$ adb shell mkdir -p /sdcard/Android/data/$PACKAGE_NAME/angle_capture
|
||||
```
|
||||
|
||||
2. Set properties to use for environment variable
|
||||
|
||||
On Android, it is difficult to set an environment variable before starting native code.
|
||||
To work around this, ANGLE will read debug system properties before starting the capture
|
||||
and use them to prime environment variables used by the capture code.
|
||||
|
||||
Note: Mid-execution capture doesn't work for Android just yet, so frame_start must be
|
||||
zero, which is the default. This it is sufficient to only set the end frame.
|
||||
```
|
||||
$ adb shell setprop debug.angle.capture.frame_end 200
|
||||
```
|
||||
|
||||
There are other properties that can be set that match 1:1 with the env vars, but
|
||||
they are not required for capture:
|
||||
```
|
||||
# Optional
|
||||
$ adb shell setprop debug.angle.capture.enabled 0
|
||||
$ adb shell setprop debug.angle.capture.out_dir foo
|
||||
$ adb shell setprop debug.angle.capture.frame_start 0
|
||||
$ adb shell setprop debug.angle.capture.label bar
|
||||
```
|
||||
|
||||
3. Run the application, then pull the files to the capture_replay directory
|
||||
```
|
||||
$ cd samples/capture_replay
|
||||
$ adb pull /sdcard/Android/data/$PACKAGE_NAME/angle_capture replay_files
|
||||
$ cp replay_files/* .
|
||||
```
|
||||
|
||||
4. Update your GN args to specifiy which context will be replayed.
|
||||
|
||||
By default Context ID 1 will be replayed. On Android, Context ID 2 is more typical, some apps
|
||||
we've run go as high as ID 6.
|
||||
Note: this solution is temporary until EGL capture is in place.
|
||||
```
|
||||
angle_capture_replay_sample_context_id = 2
|
||||
```
|
||||
|
||||
5. Replay the capture on desktop
|
||||
|
||||
Until we have samples building for Android, the replay sample must be run on desktop.
|
||||
We will also be plumbing replay files into perf and correctness tests which will run on Android.
|
||||
```
|
||||
$ autoninja -C out/Release capture_replay_sample
|
||||
$ out/Release/capture_replay_sample
|
||||
```
|
||||
|
||||
### Starting capture at an arbitrary frame
|
||||
In some scenarios, you don't know which frame you want to start on. You'll only know when target
|
||||
content is being rendered. For that we've added a trigger that can allow starting the capture at
|
||||
any time.
|
||||
|
||||
To use it, set the following environment variable, in addition to all the setup steps above. Set
|
||||
the trigger value equal to the number of frames you'd like to capture.
|
||||
```
|
||||
adb shell setprop debug.angle.capture.trigger 20
|
||||
```
|
||||
When this value is set, `ANGLE_CAPTURE_FRAME_START` and `ANGLE_CAPTURE_FRAME_END` will be ignored.
|
||||
|
||||
While your content is rendering, wait until you arrive at the scene you'd like to capture. Then
|
||||
set the value back to zero:
|
||||
```
|
||||
adb shell setprop debug.angle.capture.trigger 0
|
||||
```
|
||||
ANGLE will detect this change and start recording the requested number of frames.
|
||||
|
||||
## Testing
|
||||
|
||||
### Regression Testing Architecture
|
||||
The [python script][link_to_python_script] uses the job queue pattern. We spawn n-1 independent
|
||||
worker processes, where n is the value returned by multiprocessing.cpu_count(). Whenever a worker
|
||||
process finishes a job and becomes available, it grabs the next job from a shared job queue and
|
||||
runs that job on its CPU core. When there are no more jobs in the queue, the worker processes
|
||||
terminate and the main process reports results.
|
||||
|
||||

|
||||
|
||||
### Job unit
|
||||
A job unit is a test batch. Each test has to go through 3 stages: capture run, replay build, and
|
||||
replay run. The test batch batches the replay build stage of multiple tests together, and the
|
||||
replay run stage of multiple tests together.
|
||||
|
||||

|
||||
|
||||
### Running tests
|
||||
From the command line, navigate to the ANGLE root folder [angle][angle_folder] then run the
|
||||
command below:
|
||||
```
|
||||
python3 src/tests/capture_replay_tests.py --use-goma --gtest_filter=*/ES2_Vulkan --keep-temp-files --output-to-file --batch-count=8
|
||||
```
|
||||
|
||||
* `--use-goma` to turn on/off building with goma
|
||||
* `--gtest_filter` to run only specific tests
|
||||
* `--keep-temp-files` to keep the trace files
|
||||
* `--output-to-file` to write the log to results.txt at
|
||||
[src/tests/capture_replay_tests][capture_replay_test_folder] folder.
|
||||
* `--batch-count` to set the number of tests in a batch. More tests in a batch means that
|
||||
the tests will finish faster, but also means a lower level of granularity.
|
||||
All command line arguments can be found at the top of the [python script][link_to_python_script].
|
||||
|
||||
[angle_folder]: ../
|
||||
[capture_replay_test_folder]: ../src/tests/capture_replay_tests/
|
||||
[link_to_python_script]: ../src/tests/capture_replay_tests.py
|
||||
[CaptureTrigger]: ../src/tests/restricted_traces/README.md#trigger-the-capture
|
||||
@@ -1,77 +0,0 @@
|
||||
# Choosing an ANGLE branch for your project
|
||||
|
||||
ANGLE is under continuous development, and does not create release tarballs or
|
||||
tag specific revisions as releases, which may make the process of choosing a
|
||||
point in ANGLE's history as the dependency for your project less than obvious.
|
||||
This document illustrates how to choose a branch of ANGLE which can be expected
|
||||
to be updated with critical fixes, should they be needed.
|
||||
|
||||
## ANGLE automatic branching
|
||||
|
||||
Branches are created automatically in ANGLE to correspond to branches created in
|
||||
Chromium. These branches are named `chromium/####`, where the number is the
|
||||
matching Chromium branch. These branches will be created from the revision which
|
||||
that Chromium branch points to as its dependency. So, for example, the
|
||||
`chromium/2013` branch point is at r28bcf4ff, because [Chromium's dependency
|
||||
file for the 2013 branch]
|
||||
(http://src.chromium.org/viewvc/chrome/branches/2013/src/DEPS?revision=272741)
|
||||
uses this ANGLE revision.
|
||||
|
||||
It isn't necessary to be familiar with how Chromium's dependency management
|
||||
works to choose an appropriate ANGLE branch for your project. You will, however,
|
||||
likely want to make sure that you choose a branch that is used for a relatively
|
||||
stable Chromium release channel build, as those branches will be deployed with
|
||||
Chromium, and receive updates if bugs are found and fixed during release
|
||||
lifetime, while the more volatile channels will turn over quickly, and their
|
||||
branches will be short-lived.
|
||||
|
||||
**We recommend choosing a branch corresponding to a Beta or Stable Chromium
|
||||
release** if you are pursuing periodic, not continuous, integration of ANGLE.
|
||||
|
||||
## Matching a Chromium release to an ANGLE branch
|
||||
|
||||
In order to determine which branches are used by Chromium releases, please use
|
||||
[the OmahaProxy tool](http://omahaproxy.appspot.com/), which lists build
|
||||
information about current Chromium releases. Find the entry for a suitable
|
||||
release channel (for now, we recommend one of the Windows desktop releases), and
|
||||
note the branch listed in the `true_branch` column. This identifies the ANGLE
|
||||
branch used by that Chromium release.
|
||||
|
||||
## Updates to release branches
|
||||
|
||||
If bugs (stability, security, performance, or otherwise) are discovered after a
|
||||
branch has been created, and that branch is used by a Chromium release, the
|
||||
fixes for those bugs will be applied to the ANGLE branches for uptake by
|
||||
Chromium and any other projects using that branch. You should need only to
|
||||
perform a `git pull` to check for and apply any such changes.
|
||||
|
||||
## Cherry-picking a change to a release branch
|
||||
|
||||
Occasionally a bug fix must be merged back to an earlier Chromium
|
||||
release branch. To do this, first look up the branch number in
|
||||
[OmahaProxy](https://omahaproxy.appspot.com/). For example, M55
|
||||
corresponds to branch number 2883.
|
||||
|
||||
In the simple case where there are no conflicts, the merge can be done
|
||||
entirely in the Gerrit UI. Click the "Cherry pick" button and enter
|
||||
`chromium/[branch_number]` as the branch to merge to.
|
||||
|
||||
If there are conflicts, however, follow these steps:
|
||||
|
||||
1. `git checkout chromium/[branch_number]`
|
||||
2. `git cherry-pick [commit_hash]`
|
||||
3. Fix any merge conflicts.
|
||||
4. `git cl upload`
|
||||
|
||||
Have the cherry-pick reviewed, and then land it. It's also OK to skip
|
||||
the review and land it yourself with TBR= in the issue description, if
|
||||
you have that ability.
|
||||
|
||||
There is one final step to pick up the ANGLE change into a Chromium Beta or
|
||||
Stable branch. A Skia auto-roller updates the DEPS file in the corresponding
|
||||
Chromium branch automatically once the ANGLE change is merged into an ANGLE
|
||||
branch. To make sure that your change has made it into Chromium you can check
|
||||
these auto-rollers:
|
||||
|
||||
1. https://autoroll.skia.org/r/angle-chromium-beta-autoroll
|
||||
1. https://autoroll.skia.org/r/angle-chromium-stable-autoroll
|
||||
@@ -1,57 +0,0 @@
|
||||
# ANGLE's Code Review Process
|
||||
|
||||
This page describes the review process for ANGLE reviewers and committers. For
|
||||
instructions on submitting your change list for review, please see
|
||||
[ContributingCode](ContributingCode.md).
|
||||
|
||||
## Reviewing Changes
|
||||
|
||||
The author of a CL may designate reviewers. Please feel free to weigh in on
|
||||
changes even if you are not a designated reviewer!
|
||||
|
||||
1. To review a change, you can either navigate directly to the URL for the CL,
|
||||
or, if you are one of the designated reviewers, the change will appear in
|
||||
your dashboard at https://chromium-review.googlesource.com/
|
||||
2. Review the change listed by looking over the diffs listed in the most recent
|
||||
patch set.
|
||||
* You may view the diffs either side-to-side, or in unified diff format.
|
||||
* You can comment on a specific line of code by double-clicking that line,
|
||||
or on the file as a whole by clicking the "Add file comment" icon, which
|
||||
appears above the diff, in the line number column.
|
||||
* Note that, for CLs submitted as fixes to standing bugs, style issues
|
||||
that pre-exist the CL are not required to be addressed in the CL. As a
|
||||
reviewer, you can request a follow-up CL to address the style issue if
|
||||
you desire. This exception doesn't apply for CLs which implement new
|
||||
functionality, perform refactoring, or introduce style issues
|
||||
themselves.
|
||||
3. Once your review is complete, click the "Review" button
|
||||
* If you are satisfied with the change list as it is, give a positive
|
||||
review (Code-Review +1 or +2).
|
||||
* If you think the change list is a good idea, but needs changes, leave
|
||||
comments and a neutral review. (Code-Review 0)
|
||||
* If you think the change list should be abandoned, give a negative
|
||||
review. (Code-Review -1 or -2)
|
||||
* A +2 code review is required before landing. Only ANGLE committers may
|
||||
provide a +2 code review.
|
||||
* ANGLE has a 2-reviewer policy for CLs. This means all changes should get
|
||||
a positive review from more than one person before they are accepted.
|
||||
This is most usually handled by reserving the +2 review for the second
|
||||
reviewer to clear the CL.
|
||||
* If you made comments on the files, the draft comments will appear below
|
||||
the cover message. These comments are not published until you click on
|
||||
the "Publish Comments" button.
|
||||
4. Verification and landing:
|
||||
* If the CL author is not an ANGLE committer, the CL should be verified
|
||||
and landed by a committer. Once verified, the "+1 Verified" status may
|
||||
be added, and the CL may be landed with the "Publish and Submit" button.
|
||||
There should be no need to rebase via the "Rebase Change" button prior
|
||||
to landing.
|
||||
* If the CL author is an ANGLE committer, they should verify and land the
|
||||
CL themselves.
|
||||
* Please note: Verification and commit-queue workflow may be subject to
|
||||
change in the near future.
|
||||
5. Cherry-picking to other branches
|
||||
* If the change is needed on other branches, you may be able to land it
|
||||
using the "Cherry Pick To" button on the CL page.
|
||||
* If this cherry pick fails, you will need to rebase the patch yourself
|
||||
and submit a new change for review on the branch.
|
||||
@@ -1,176 +0,0 @@
|
||||
# Coding Standard for the ANGLE Project
|
||||
|
||||
## Google Style Guide
|
||||
|
||||
We generally use the [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) as a basis for
|
||||
our Coding Standard, however we will deviate from it in a few areas, as noted
|
||||
below.
|
||||
|
||||
Items marked {DEV} indicate a deviation from the Google guidelines. Items marked
|
||||
{DO} are reiterating points from the Google guidelines.
|
||||
|
||||
Before you upload code to Gerrit, use `git cl format` to auto-format your code.
|
||||
This will catch most of the trivial formatting errors and save you time.
|
||||
|
||||
### [Header Files](https://google.github.io/styleguide/cppguide.html#Header_Files)
|
||||
|
||||
* We use **`.h`** for C++ headers.
|
||||
* {DEV} #define guards should be of the form: `<PATH>_<FILE>_H_`. (Compiler
|
||||
codebase is varied, including `<PROJECT>_` makes the names excessively
|
||||
long).
|
||||
|
||||
### [Scoping](https://google.github.io/styleguide/cppguide.html#Scoping)
|
||||
|
||||
* {DO} avoid globally scoped variables, unless absolutely necessary.
|
||||
|
||||
### [Classes](https://google.github.io/styleguide/cppguide.html#Classes)
|
||||
|
||||
* {DEV} Inherit (privately) from angle::NonCopyable helper class (defined in
|
||||
common/angleutils.h) to disable default copy and assignment operators.
|
||||
|
||||
### [Other C++ Features](https://google.github.io/styleguide/cppguide.html#Other_C++_Features)
|
||||
|
||||
* {DO} avoid use of default arguments.
|
||||
* {DONT} use C++ exceptions, they are disabled in the builds and not caught.
|
||||
* {DO} use nullptr (instead of 0 or NULL) for pointers.
|
||||
* {DO} use size\_t for loop iterators and size values.
|
||||
* {DO} use uint8\_t pointers instead of void pointers to denote binary data.
|
||||
* {DO} use C++11/14/17 according to the
|
||||
[Chromium C++ features guide](https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++-features.md).
|
||||
|
||||
### [Naming](https://google.github.io/styleguide/cppguide.html#Naming)
|
||||
|
||||
#### File Names
|
||||
|
||||
* {DEV} Filenames should be all lowercase and can include underscores (`_`).
|
||||
If the file is an implementation of a class, the filename may be capitalized
|
||||
the same as the major class.
|
||||
* {DEV} We use .cpp (instead of .cc), .h and .inl (inlined files) for C++
|
||||
files and headers.
|
||||
|
||||
#### Directory Names
|
||||
* Directory names should be all lowercase, unless following an externally
|
||||
imposed capitalization (eg include/EGL, or src/libGLESv2, etc)
|
||||
|
||||
#### Variable Names
|
||||
|
||||
Use the following guidelines, they do deviate somewhat from the [Google
|
||||
guidelines](https://google.github.io/styleguide/cppguide.html#Naming).
|
||||
|
||||
* Class and type names: start with capital letter and use CamelCase.
|
||||
* {DEV} Class member variables: use an **`m`** prefix instead of trailing
|
||||
underscore and use CamelCase.
|
||||
* Global variables (if they must be used): use a **`g`** prefix.
|
||||
* {DEV} Variable names: start with lower case and use CamelCase (chosen for consistency)
|
||||
* {DEV} Function names: Member functions start with lower case and use CamelCase. Non-member and static member functions start with capital letter and
|
||||
use CamelCase (chosen for consistency)
|
||||
* {DO} Constants: start with a **`k`** and use CamelCase
|
||||
* Namespaces: short names. use all lower case
|
||||
* {DEV} Enum Names: use strongly typed class enums when possible. Use CamelCase for class enum members. See [official docs][EnumsOfficial].
|
||||
* Macros: all uppercase with underscores
|
||||
* Exceptions to naming: use common sense!
|
||||
|
||||
[EnumsOfficial]: https://google.github.io/styleguide/cppguide.html#Enumerator_Names
|
||||
|
||||
### [Comments](https://google.github.io/styleguide/cppguide.html#Comments)
|
||||
|
||||
* {DO} read and follow Google's recommendations.
|
||||
* Each file **must** start with the following boilerplate notice:
|
||||
|
||||
```
|
||||
//
|
||||
// Copyright $YEAR The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
```
|
||||
|
||||
* $YEAR should be set to the current year at the time a file is created, and not changed thereafter.
|
||||
|
||||
### [Formatting](https://google.github.io/styleguide/cppguide.html#Formatting)
|
||||
|
||||
* {DEV} Avoid excessively long lines. Please keep lines under 100 columns
|
||||
long.
|
||||
* Use unix-style newlines.
|
||||
* {DO} use only spaces. No tab characters. Configure your editor to emit
|
||||
spaces when you hit the TAB-key.
|
||||
* {DEV} indent 4 spaces at a time.
|
||||
* conditionals: place space outside the parenthesis. No spaces inside.
|
||||
* switch statements: use the output of `git cl format`.
|
||||
* class format(eg private, public, protected): indent by 2 spaces. Regular
|
||||
4-space indent from the outer scope for declarations/definitions.
|
||||
* pointers and references: **`*`** and **`&`** tight against the variable
|
||||
* namespaces: are not indented.
|
||||
* extern code blocks: are not indented.
|
||||
* {DEV} braces should go on a separate line, except for functions defined in a
|
||||
header file where the whole function declaration and definition fit on one
|
||||
line.
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
if (conditional)
|
||||
{
|
||||
stuff();
|
||||
}
|
||||
else
|
||||
{
|
||||
otherstuff()
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
switch (conditional)
|
||||
{
|
||||
case foo:
|
||||
dostuff();
|
||||
break;
|
||||
case bar:
|
||||
otherstuff();
|
||||
break;
|
||||
default:
|
||||
WTFBBQ();
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
class MyClass : public Foo
|
||||
{
|
||||
public:
|
||||
MyClass();
|
||||
~MyClass() {};
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(MyClass);
|
||||
};
|
||||
```
|
||||
|
||||
```
|
||||
char *c;
|
||||
const string &str;
|
||||
```
|
||||
|
||||
### [Exceptions to the Rules](https://google.github.io/styleguide/cppguide.html#Exceptions_to_the_Rules)
|
||||
|
||||
* If modifying pre-existing code that does not match the standard, the altered
|
||||
portions of the code should be changed to match the standard.
|
||||
|
||||
### Generated Source Files
|
||||
|
||||
Prefer storing generated sources as baked files in the repository. Avoid using
|
||||
GN actions to run Python scripts.
|
||||
|
||||
**Definition:**
|
||||
|
||||
Sometimes helper scripts can create compilable sources more easily from XML or
|
||||
JSON data sources than maintaining source files by hand. These scripts are often
|
||||
written in Python and output generated sources.
|
||||
|
||||
**Decision**
|
||||
|
||||
Storing generated sources in the repository makes integration easier for non-GN
|
||||
users. Python scripts can be expensive and slow to run at compile-time.
|
||||
Generated sources can be a pain point for messing up builds.
|
||||
|
||||
It could be possible to solve the build clobbering problem. And we could replace
|
||||
Python with something faster. But to allow for easier integration with our tools
|
||||
and customers we should bake generated files into the repository.
|
||||
@@ -1,108 +0,0 @@
|
||||
# Introduction
|
||||
|
||||
There are many situations in which it's useful for WebGL applications to
|
||||
transform shaders in various ways. ANGLE's shader translator can be used for
|
||||
this purpose: compiling it with [Emscripten](http://emscripten.org/) allows it
|
||||
to be invoked from a web page. This wiki page provides some preliminary details
|
||||
about how to do this.
|
||||
|
||||
# Details
|
||||
|
||||
Pull top of tree ANGLE.
|
||||
|
||||
Install the Emscripten toolchain per the [instructions](http://emscripten.org/).
|
||||
|
||||
Symlink (preferred) or copy the ANGLE directory into ...emsdk/emscripten/master.
|
||||
|
||||
Put a shader to compile into a file (named with .vert or .frag suffix) in the
|
||||
same directory. For example, put the following shader from the [WebGL Aquarium]
|
||||
(http://webglsamples.org/aquarium/aquarium.html) into `aq-fish-nm.frag`:
|
||||
|
||||
```
|
||||
precision mediump float;
|
||||
uniform vec4 lightColor;
|
||||
varying vec4 v_position;
|
||||
varying vec2 v_texCoord;
|
||||
varying vec3 v_tangent; // #normalMap
|
||||
varying vec3 v_binormal; // #normalMap
|
||||
varying vec3 v_normal;
|
||||
varying vec3 v_surfaceToLight;
|
||||
varying vec3 v_surfaceToView;
|
||||
|
||||
uniform vec4 ambient;
|
||||
uniform sampler2D diffuse;
|
||||
uniform vec4 specular;
|
||||
uniform sampler2D normalMap; // #normalMap
|
||||
uniform float shininess;
|
||||
uniform float specularFactor;
|
||||
// #fogUniforms
|
||||
|
||||
vec4 lit(float l ,float h, float m) {
|
||||
return vec4(1.0,
|
||||
max(l, 0.0),
|
||||
(l > 0.0) ? pow(max(0.0, h), m) : 0.0,
|
||||
1.0);
|
||||
}
|
||||
void main() {
|
||||
vec4 diffuseColor = texture2D(diffuse, v_texCoord);
|
||||
mat3 tangentToWorld = mat3(v_tangent, // #normalMap
|
||||
v_binormal, // #normalMap
|
||||
v_normal); // #normalMap
|
||||
vec4 normalSpec = texture2D(normalMap, v_texCoord.xy); // #normalMap
|
||||
vec3 tangentNormal = normalSpec.xyz - vec3(0.5, 0.5, 0.5); // #normalMap
|
||||
tangentNormal = normalize(tangentNormal + vec3(0, 0, 2)); // #normalMap
|
||||
vec3 normal = (tangentToWorld * tangentNormal); // #normalMap
|
||||
normal = normalize(normal); // #normalMap
|
||||
vec3 surfaceToLight = normalize(v_surfaceToLight);
|
||||
vec3 surfaceToView = normalize(v_surfaceToView);
|
||||
vec3 halfVector = normalize(surfaceToLight + surfaceToView);
|
||||
vec4 litR = lit(dot(normal, surfaceToLight),
|
||||
dot(normal, halfVector), shininess);
|
||||
vec4 outColor = vec4(
|
||||
(lightColor * (diffuseColor * litR.y + diffuseColor * ambient +
|
||||
specular * litR.z * specularFactor * normalSpec.a)).rgb,
|
||||
diffuseColor.a);
|
||||
// #fogCode
|
||||
gl_FragColor = outColor;
|
||||
}
|
||||
```
|
||||
|
||||
Compile the shader translator, the translator sample, and the shader all
|
||||
together:
|
||||
|
||||
```
|
||||
./emcc -Iangle/include -Iangle/src angle/samples/translator/translator.cpp angle/src/compiler/preprocessor/*.cpp angle/src/compiler/translator/*.cpp angle/src/compiler/translator/timing/*.cpp angle/src/compiler/translator/depgraph/*.cpp angle/src/third_party/compiler/*.cpp angle/src/common/*.cpp -o translator.html --preload-file aq-fish-nm.frag -s NO_EXIT_RUNTIME=1
|
||||
```
|
||||
|
||||
Serve up the resulting translator.html via `python -m SimpleHTTPServer`.
|
||||
Navigate the browser to localhost:8000.
|
||||
|
||||
The translator sample will run, displaying its output into the text area on the
|
||||
page. Since it isn't receiving any input, it simply outputs a help message and
|
||||
exits.
|
||||
|
||||
To invoke the translator again, processing the shader we included along with the
|
||||
source code, open the JavaScript console and type:
|
||||
|
||||
```
|
||||
Module['callMain'](['-s=w', '-u', 'aq-fish-nm.frag'])
|
||||
```
|
||||
|
||||
The active uniforms and their types will be printed to the text area after the
|
||||
translator sample processes the shader.
|
||||
|
||||
# Issues and Next Steps
|
||||
|
||||
It's clearly not useful to have to compile the shader in to the
|
||||
Emscripten-translated executable. It would be helpful to define a simple wrapper
|
||||
function which can easily be called from JavaScript and which defines enough
|
||||
parameters to pass in a shader as a string, transform it somehow or compile it
|
||||
to another language target, and return the compiled result (or other
|
||||
information). A simple JavaScript library that wraps all of the interactions
|
||||
with the Emscripten binary would be useful.
|
||||
|
||||
It's not feasible to interact with the translator's data structures, nor
|
||||
traverse the AST from JavaScript. The code that operates upon the shader must be
|
||||
written in C++ and compiled in to the shader translator.
|
||||
|
||||
emcc should be integrated better with ANGLE's build system.
|
||||
@@ -1,272 +0,0 @@
|
||||
# Contributing Code
|
||||
|
||||
## Communicate
|
||||
|
||||
* Whether you're writing a new feature or fixing an existing bug, it pays to get a second opinion
|
||||
before you get too far. If it's a new feature idea, post to the discussion group
|
||||
([angleproject][ANGLE-website]).
|
||||
* Not all bugs in our [bug system][anglebug.com] are assigned, but if the one you're interested in
|
||||
fixing is, send a note to the person it's assigned to and ask if they would like a patch.
|
||||
* Behavior changes and anything nontrivial (i.e. anything other than simple cleanups and style
|
||||
fixes) should generally be tracked in the bug system. Please [file a bug][anglebug-new] and
|
||||
describe what you're doing if there isn't one already.
|
||||
* If you would like bug-editing rights, simply ask a team member via email or the discussion group.
|
||||
|
||||
[ANGLE-website]: https://groups.google.com/forum/?fromgroups#!forum/angleproject
|
||||
[anglebug.com]: http://anglebug.com
|
||||
[anglebug-new]: http://anglebug.com/new
|
||||
|
||||
## Get your code ready
|
||||
|
||||
### Code
|
||||
|
||||
1. Must conform to the [ANGLE style][ANGLE-style] guidelines.
|
||||
2. Must be tested. (see the [Testing][Testing] section below)
|
||||
3. Should be a reasonable size to review. Giant patches are unlikely to get reviewed quickly.
|
||||
|
||||
[ANGLE-style]: CodingStandard.md
|
||||
[Testing]: #Testing
|
||||
|
||||
### Build maintenance
|
||||
|
||||
1. If you added or removed source files:
|
||||
* You _must_ update the build files with your changes. See [`src/libGLESv2.gni`][libGLESv2.gni]
|
||||
and [`src/compiler.gni`][compiler.gni].
|
||||
2. ANGLE's BUILD.gn script is used by [Chromium's gn build][gn-build-config]. If you change build
|
||||
files other than to add or remove source files be aware you could break the Chromium build.
|
||||
ANGLE's commit queue (CQ) will detect such breakage. Ask a project member for help with Chromium
|
||||
issues if you don't have a Chromium checkout.
|
||||
3. Some generated code is baked into the repository. If you modify the source of these files, such
|
||||
as the translator's [`glslang.l`][glslang.l], or one of the internal shaders in the Vulkan
|
||||
backend, you will need to run [`scripts/run_code_generation.py`][run_code_generation.py] and
|
||||
include the autogenerated files in your change.
|
||||
`git cl upload` should warn you if you are missing this step.
|
||||
|
||||
[gn-build-config]: https://www.chromium.org/developers/gn-build-configuration
|
||||
[compiler.gni]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/compiler.gni
|
||||
[libGLESv2.gni]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/libGLESv2.gni
|
||||
[glslang.l]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/src/compiler/translator/glslang.l
|
||||
[run_code_generation.py]: https://chromium.googlesource.com/angle/angle/+/refs/heads/main/scripts/run_code_generation.py
|
||||
|
||||
### Testing
|
||||
|
||||
* ANGLE uses trybots to test on a variety of platforms. Please run your changes against our bots
|
||||
and check the results before landing changes or requesting reviews.
|
||||
* Upload your change (see [Making changes](#making-changes)).
|
||||
* To kick off a try job, use the 'CQ Dry Run' button, or set the Commit-Queue +1 label to trigger
|
||||
a dry run of the CQ (will not land the change).
|
||||
* If you are not part of the `angle-committers` group, you will need to either ask to be added or
|
||||
ask a member of the group to submit the tryjob for you. Add jmadill or geofflang as a reviewer
|
||||
for assistance.
|
||||
* Wait for the bots to report the result on the code review page. The bot results should be
|
||||
visible in Gerrit as yellow (in-progress), green (passed), or red (failed). This can take up to
|
||||
two hours for some of the debug bots. Click on the colored rectangle to open the bot log to
|
||||
triage failed tests.
|
||||
* If a failure is unexpected, or seems likely unrelated to your change, ask an ANGLE project
|
||||
member for advice.
|
||||
* We do not currently have the capability to run individual bots or tests in a run.
|
||||
* Tests can also be run locally, ANGLE's main testing methods are:
|
||||
* `angle_unittests`, `angle_end2end_tests` and `angle_white_box_tests` targets.
|
||||
* The OpenGL CTS also known as [drawElements Quality Program (dEQP)](dEQP.md).
|
||||
If you're working on a new feature, there may be some extensive tests for it already written.
|
||||
* The [Top-of-Tree WebGL Conformance tests][WebGL-CTS].
|
||||
* If you are a Chromium developer, see
|
||||
[Building ANGLE for Chromium Development][build-ANGLE-for-chromium] for instructions on
|
||||
building ANGLE within Chromium.
|
||||
* If you aren't a browser developer, you should be able to drop your compiled DLLs into a
|
||||
Chrome installation, in place of those distributed with Chrome, to check WebGL conformance.
|
||||
[Chrome Canary][Chrome-Canary] is well-suited for this.
|
||||
* If your code isn't covered by an existing test, you are *strongly encouraged* to add new test
|
||||
coverage. This both ensures that your code is correct and that new contributors won't break it
|
||||
in the future.
|
||||
* Add new tests to `angle_end2end_tests` for OpenGL-based API tests, `angle_unittests` for
|
||||
cross-platform internal tests, and `angle_white_box_tests` for rendering tests which also need
|
||||
visibility into internal ANGLE classes.
|
||||
* If you are submitting a performance fix, test your code with `angle_perftests` and add a new
|
||||
performance test if it is not covered by the existing benchmarks. For more documentation on
|
||||
`angle_perftests` see the [README][README].
|
||||
* The [Chromium GPU FYI bot waterfall][Chromium-waterfall] provides continuous integration for
|
||||
ANGLE patches that have been committed. There may be hardware configurations that are not
|
||||
tested by the ANGLE trybots, if you notice breakage on this waterfall after landing a patch,
|
||||
please notify a project member.
|
||||
|
||||
[WebGL-CTS]: https://www.khronos.org/registry/webgl/sdk/tests/webgl-conformance-tests.html
|
||||
[build-ANGLE-for-Chromium]: BuildingAngleForChromiumDevelopment.md
|
||||
[Chrome-Canary]: https://www.google.com/chrome/browser/canary.html
|
||||
[README]: ../src/tests/perf_tests/README.md
|
||||
[Chromium-waterfall]: https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console
|
||||
|
||||
### Legal
|
||||
|
||||
1. You must complete the [Individual Contributor License Agreement][Individual-CLA]. You can do this
|
||||
online, and it only takes a minute. If you are contributing on behalf of a corporation, you must
|
||||
fill out the [Corporate Contributor License Agreement][Corporate-CLA] and send it to Google as
|
||||
described on that page.
|
||||
2. Once you've submitted the CLA, please email the following information (as entered on the CLA) to
|
||||
`shannonwoods at chromium dot org` for record keeping purposes:
|
||||
* Full Name:
|
||||
* Email:
|
||||
* Company (If applicable):
|
||||
3. If you've never submitted code before, you must add your (or your organization's) name and
|
||||
contact info to the [AUTHORS](../AUTHORS) file.
|
||||
4. *NOTE TO REVIEWERS*: Follow the [External Contributor Checklist][Contributor-checklist].
|
||||
|
||||
[Individual-CLA]: https://cla.developers.google.com/about/google-individual
|
||||
[Corporate-CLA]: https://cla.developers.google.com/about/google-corporate
|
||||
[Contributor-checklist]: http://www.chromium.org/developers/contributing-code/external-contributor-checklist
|
||||
|
||||
## Life of a Change List
|
||||
|
||||
### <a name="getting-started-with-gerrit"></a>Getting started with Gerrit for ANGLE
|
||||
|
||||
1. Go to [https://chromium.googlesource.com/new-password][CR-passwd]
|
||||
2. Log in with the email you use for your git commits.
|
||||
3. Follow the directions on the new-password page to set up authentication with your Google account.
|
||||
4. Make sure to set your real name.
|
||||
* Visit [https://chromium-review.googlesource.com/#/settings][CR-settings] and check the "Full
|
||||
Name" field.
|
||||
5. Check out the repository (see [DevSetup](DevSetup.md)).
|
||||
6. Install the Gerrit `commit_msg` hook
|
||||
* Gerrit requires a hook to append a change ID tag to each commit, so that it can associate your
|
||||
CL with a particular review, and track dependencies between commits.
|
||||
* Download the hook from
|
||||
[https://chromium-review.googlesource.com/tools/hooks/commit-msg][commit-msg-hook] and copy
|
||||
this file to `.git/hooks/commit-msg` within your local repository. On non-Windows platforms,
|
||||
ensure that permissions are set to allow execution.
|
||||
* *BE AWARE:* Some patch management tools, such as StGit, currently bypass git hooks. They should
|
||||
not currently be used with changes intended for review.
|
||||
|
||||
[CR-passwd]: https://chromium.googlesource.com/new-password
|
||||
[CR-settings]: https://chromium-review.googlesource.com/#/settings
|
||||
[commit-msg-hook]: https://chromium-review.googlesource.com/tools/hooks/commit-msg
|
||||
|
||||
### Making changes
|
||||
|
||||
1. Commit your changes locally:
|
||||
* `git add src/../FileName.cpp`
|
||||
* `git commit`
|
||||
* A text editor will open. Add a description at the top of the file.
|
||||
* Associate the CL with an issue in the issue tracker (e.g. a fix for a reported bug)
|
||||
by adding the following line to the commit message: `Bug: angleproject:<issue number>`.
|
||||
* If necessary please file a new bug at http://anglebug.com/new
|
||||
* Save.
|
||||
* Close the text editor.
|
||||
* Use `git commit --amend` to update your CL with new changes.
|
||||
* Use `git cl format` to amend the style of your CL. This saves both your time and the reviewers'!
|
||||
2. Ensure your code is landed on top of latest changes
|
||||
* `git pull --rebase`
|
||||
* Resolve conflicts if necessary
|
||||
3. Upload the change list
|
||||
* `git cl upload`
|
||||
* The change list and modified files will be uploaded to [ANGLE Gerrit][ANGLE-Gerrit].
|
||||
* Follow the generated URL to the new issue.
|
||||
* Take a moment to perform a self-review of your code. Gerrit's viewer makes it easy to see
|
||||
whitespace errors, erroneous tabs, and other simple style problems.
|
||||
* [Select reviewers](#selecting-reviewers). If you don't do this, reviewers may not realize
|
||||
you're requesting a review!
|
||||
* Make changes, upload and repeat as necessary.
|
||||
* Project members and others will review your code as described in the
|
||||
[CodeReviewProcess](CodeReviewProcess.md).
|
||||
5. If your change list needs revision:
|
||||
* If you have correctly installed the commit hook from the section above, Gerrit will be able to
|
||||
track your changes by Change-Id.
|
||||
* You should need only to update your commit with `git commit --amend` and re-upload with
|
||||
`git cl upload`.
|
||||
6. Landing change after it receives +2 Code Review:
|
||||
* If you are a committer, you may submit the change yourself via the Gerrit web interface.
|
||||
* If you are not a committer, ask your reviewer to submit the change list.
|
||||
7. Pull and integrate reviewed CL:
|
||||
* `git pull --rebase`
|
||||
|
||||
[ANGLE-Gerrit]: https://chromium-review.googlesource.com/q/project:angle/angle
|
||||
|
||||
### Selecting reviewers
|
||||
|
||||
When your CL is ready to review, you can use the "Find Owners" button in
|
||||
Gerrit to select appropriate code reviewers. They will be able to route your
|
||||
CL to additional reviewers as neccessary and answer any questions you may have
|
||||
about the process.
|
||||
|
||||
### Rules for submission
|
||||
|
||||
* At least one **Owner** must give approval.
|
||||
* The owner must be from the **most specific** directory.
|
||||
* At least two **Committers** must give approval for non-trival CLs.
|
||||
For trivial CLs, a single Owner approval is sufficient.
|
||||
* Only **Committers** may submit CLs. If you aren't a committer please ask for help submitting.
|
||||
* Committers may submit high-priority small CLs immediately using **TBR**.
|
||||
See [the Chromium docs][TBR] for more info.
|
||||
* There are exceptions to these rules. Use your best judgement.
|
||||
|
||||
[TBR]: https://chromium.googlesource.com/chromium/src/+/main/docs/code_reviews.md#tbr-to-be-reviewed
|
||||
|
||||
### Reverting a CL
|
||||
|
||||
Sometimes a change will cause an unforseen problem, e.g. on a platform that's not tested with
|
||||
pre-submit testing. In those cases, a CL may be reverted; often by a "[Wrangler][wrangler]", who is
|
||||
an engineer who keeps the testing infrastructure healthy/green.
|
||||
|
||||
[wrangler]: ../infra/ANGLEWrangling.md
|
||||
|
||||
The best and easiest way to create a revert change is with Gerrit's **REVERT** button, in the
|
||||
upper-right corner of the original change. Pressing this will pop up a dialog with a template
|
||||
commit message, and an optional checkbox for automatically sending the revert CL to CQ. Please edit
|
||||
the commit message with the reason for the revert. When satisfied, press the dialog's **REVERT**
|
||||
button. It is wise to add the author and reviewers of the original CL as reviewers of the revert
|
||||
CL. If it's been less than 24 hours since the original CL landed, the revert Cl will land
|
||||
immediately and bypass the try bots.
|
||||
|
||||
If you cannot use Gerrit's **REVERT** button, you can create a revert CL with the "git revert"
|
||||
command. When doing so, the commit message should include a short description for why the original
|
||||
commit needs to be reverted, and potentially a bug; similar to this example [revert CL][RevertCL].
|
||||
|
||||
[RevertCL]: https://chromium-review.googlesource.com/c/chromium/src/+/2453504
|
||||
|
||||
|
||||
### Relanding a reverted CL
|
||||
|
||||
When you re-land a reverted CL, follow this process:
|
||||
|
||||
* Prefix the CL title with "Reland: ".
|
||||
* Keep the commit message of the original CL and add a description of what changed in the re-land.
|
||||
* Ensure the re-land CL has a unique Change-Id.
|
||||
* First upload the reverted CL as Patchset 1 with no changes applied.
|
||||
* Then, apply your fixes, and upload your CL as a new Patchset. The reviewers will be able to see
|
||||
the diff between Patchset 1 and the fixed/final Patchset.
|
||||
|
||||
Here is an example [reland CL][RelandCL]. This [link][RelandCLDiff] shows the difference between Patchset 1
|
||||
and the fixed/final Patchset. Notice how a reviewer can easily see the fix to the original CL.
|
||||
|
||||
[RelandCL]: https://chromium-review.googlesource.com/c/angle/angle/+/2197735
|
||||
[RelandCLDiff]: https://chromium-review.googlesource.com/c/angle/angle/+/2197735/1..3
|
||||
|
||||
If you do not need to make any changes to your CL to re-land, you can instead use Gerrit's **CREATE
|
||||
RELAND** button.
|
||||
|
||||
### Committer status
|
||||
|
||||
Similar to [Chromium's committer status][Committer-status], long-term contributors to the ANGLE
|
||||
project may request to join the `angle-committers` group. This allows you to give `+2` on code
|
||||
reviews and land patches without assistance. After about 6 months of regular contributions, you may
|
||||
request committer status from a core ANGLE team member via email or code review. Chromium
|
||||
committers and Googlers may ask at any time.
|
||||
|
||||
### OWNERS files and becoming an Owner
|
||||
|
||||
See these Chromium docs for some good guidelines: [link][Owners].
|
||||
|
||||
### More info
|
||||
|
||||
See also:
|
||||
|
||||
* [ANGLE Gerrit][ANGLE-Gerrit]
|
||||
* [Chromium Projects: Contributing Code][Contributing-code]
|
||||
* [depot_tools tutorial][depot-tools-tutorial]
|
||||
* [angle_perftests README][Perftest-README]
|
||||
* [ANGLE Testing and Processes](TestingAndProcesses.md)
|
||||
|
||||
[Committer-status]: https://dev.chromium.org/getting-involved/become-a-committer
|
||||
[Contributing-code]: http://www.chromium.org/developers/contributing-code/
|
||||
[depot-tools-tutorial]: http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html
|
||||
[Perftest-README]: ../src/tests/perf_tests/README.md
|
||||
[Owners]: https://chromium.googlesource.com/chromium/src/+/main/docs/code_reviews.md#expectations-of-owners
|
||||
@@ -1,133 +0,0 @@
|
||||
# Debug Overlay in ANGLE's Vulkan Backend
|
||||
|
||||
## Motivation
|
||||
|
||||
A complex application has frequently changing performance characteristics due to
|
||||
both a varying number of objects to draw and different effects that need to be
|
||||
applied to them. When characterizing the performance of an application, it can
|
||||
be easy to miss scenes which need optimization, especially if they are
|
||||
ephemeral.
|
||||
|
||||
A debug overlay that shows on-the-fly statistics from the running application
|
||||
can greatly aid the developer in finding where the bottlenecks are and which
|
||||
scenes need further investigation and profiling.
|
||||
|
||||
ANGLE's Vulkan debug overlay implements this. The initial implementation
|
||||
includes a few pieces of information for demonstration purposes. Here's the
|
||||
glmark2 *terrain* scene with these overlay items enabled:
|
||||
|
||||

|
||||
|
||||
This is a screenshot of a debug build, hence the low FPS. The command graph size
|
||||
widget no longer applies to current ANGLE code.
|
||||
|
||||
## Implementation
|
||||
|
||||
Overlay items are of two fundamental types:
|
||||
|
||||
* Text items: A single line of text with small or large font.
|
||||
* Graph items: A bar graph of data. These each have a Text item attached
|
||||
that is automatically rendered with the graph item.
|
||||
|
||||
Built on these, various overlay item types are defined that gather statistics.
|
||||
Five such types are defined with one item per type as example:
|
||||
|
||||
* **Count**: An item that counts something. **VulkanValidationMessageCount**
|
||||
is an overlay item of this type that shows the number of validation messages
|
||||
received from the validation layers.
|
||||
* **Text**: A generic text widget. **VulkanLastValidationMessage** is an overlay
|
||||
item of this type that shows the last validation message.
|
||||
* **PerSecond**: A value that gets reset every second automatically. **FPS** is
|
||||
an overlay item of this type that simply gets incremented on every `swap()`.
|
||||
* **RunningGraph**: A graph of the last N values. **VulkanRenderPassCount** is an
|
||||
overlay of this type. This counter reports the number of RenderPasses rendered
|
||||
in each vkQueueSubmit call.
|
||||
* **RunningHistogram**: A histogram of last N values. Input values are in the
|
||||
[0, 1] range and they are ranked to N buckets for histogram calculation.
|
||||
**VulkanSecondaryCommandBufferPoolWaste** is an overlay item of this type.
|
||||
On `vkQueueSubmit()`, the memory waste from command buffer pool allocations
|
||||
is recorded in the histogram.
|
||||
|
||||
Overlay font is placed in [libANGLE/overlay/](../src/libANGLE/overlay/) which
|
||||
[gen_overlay_fonts.py](../src/libANGLE/gen_overlay_fonts.py) processes to create
|
||||
an array of rasterized font data, which is used at runtime to create the font
|
||||
image (an image with one layer per character, and one mip level per font size).
|
||||
|
||||
The overlay widget layout is defined in
|
||||
[overlay_widgets.json](../src/libANGLE/overlay_widgets.json)
|
||||
which [gen_overlay_widgets.py](../src/libANGLE/gen_overlay_widgets.py)
|
||||
processes to generate an array of widgets, each of its respective type,
|
||||
and sets their properties, such as color and bounding box.
|
||||
The json file allows widgets to align against other widgets as well as against
|
||||
the framebuffer edges. The following is a part of this file:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "VulkanValidationMessageCount",
|
||||
"type": "Count",
|
||||
"color": [255, 0, 0, 255],
|
||||
"coords": [10, "VulkanLastValidationMessage.top.adjacent"],
|
||||
"font": "small",
|
||||
"length": 25
|
||||
},
|
||||
{
|
||||
"name": "VulkanSecondaryCommandBufferPoolWaste",
|
||||
"type": "RunningHistogram(50)",
|
||||
"color": [255, 200, 75, 200],
|
||||
"coords": [-50, 100],
|
||||
"bar_width": 6,
|
||||
"height": 100,
|
||||
"description": {
|
||||
"color": [255, 200, 75, 255],
|
||||
"coords": ["VulkanSecondaryCommandBufferPoolWaste.left.align",
|
||||
"VulkanSecondaryCommandBufferPoolWaste.top.adjacent"],
|
||||
"font": "small",
|
||||
"length": 40
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Negative coordinates in this file indicate alignment to the right/bottom of the
|
||||
framebuffer. `OtherItem.edge.mode` lets an item be aligned with another.
|
||||
If `mode` is `align`, the item has the same origin as `OtherItem` and expands
|
||||
in the same direction. If `adjacent`, the item expands in the opposite
|
||||
direction.
|
||||
|
||||
The UI is rendered in two passes, one draw call for all graph widgets and
|
||||
another draw call for all text widgets. The vertex shader in these draw calls
|
||||
generates 4 vertices for each instance (one instance per widget) based on the
|
||||
widget bounding box. The fragment shader renders font or a graph based on widget
|
||||
data. This is done once per frame on `present()`, and the result is blended into
|
||||
the swapchain image.
|
||||
|
||||
To build ANGLE with overlay capability, `angle_enable_overlay = true` must be
|
||||
placed in `args.gn`.
|
||||
|
||||
Currently, to enable overlay items an environment variable is used. For example:
|
||||
|
||||
On Desktop:
|
||||
|
||||
```commandline
|
||||
$ export ANGLE_OVERLAY=FPS:Vulkan*PipelineCache*
|
||||
$ ./hello_triangle --use-angle=vulkan
|
||||
```
|
||||
|
||||
On Android:
|
||||
|
||||
```
|
||||
$ adb shell setprop debug.angle.overlay FPS:Vulkan*PipelineCache*
|
||||
$ ./hello_triangle --use-angle=vulkan
|
||||
```
|
||||
|
||||
## Future Work
|
||||
|
||||
Possible future work:
|
||||
|
||||
* On Android, add settings in developer options and enable items based on those.
|
||||
* Spawn a small server in ANGLE and write an application that sends
|
||||
enable/disable commands remotely.
|
||||
* Move the Overlay rendering functionality to the front-end to benefit all
|
||||
backends.
|
||||
* Add more overlay widgets.
|
||||
* Implement automatic widget layout to remove the need to specify positions in
|
||||
the overlay widgets JSON.
|
||||
@@ -1,545 +0,0 @@
|
||||
# Debugging Tips
|
||||
|
||||
There are many ways to debug ANGLE using generic or platform-dependent tools. Here is a list of tips
|
||||
on how to use them.
|
||||
|
||||
## Running ANGLE under apitrace on Linux
|
||||
|
||||
[Apitrace](http://apitrace.github.io/) captures traces of OpenGL commands for later analysis,
|
||||
allowing us to see how ANGLE translates OpenGL ES commands. In order to capture the trace, it
|
||||
inserts a driver shim using `LD_PRELOAD` that records the command and then forwards it to the OpenGL
|
||||
driver.
|
||||
|
||||
The problem with ANGLE is that it exposes the same symbols as the OpenGL driver so apitrace captures
|
||||
the entry point calls intended for ANGLE and reroutes them to the OpenGL driver. In order to avoid
|
||||
this problem, use the following:
|
||||
|
||||
1. Link your application against the static ANGLE libraries (libGLESv2_static and libEGL_static) so
|
||||
they don't get shadowed by apitrace's shim.
|
||||
2. Ask apitrace to explicitly load the driver instead of using a dlsym on the current module.
|
||||
Otherwise apitrace will use ANGLE's symbols as the OpenGL driver entrypoint (causing infinite
|
||||
recursion). To do this you must point an environment variable to your GL driver. For example:
|
||||
`export TRACE_LIBGL=/usr/lib/libGL.so.1`. You can find your libGL with
|
||||
`ldconfig -p | grep libGL`.
|
||||
3. Link ANGLE against libGL instead of dlsyming the symbols at runtime; otherwise ANGLE won't use
|
||||
the replaced driver entry points. This is done with the gn arg `angle_link_glx = true`.
|
||||
|
||||
If you follow these steps, apitrace will work correctly aside from a few minor bugs like not being
|
||||
able to figure out what the default framebuffer size is if there is no glViewport command.
|
||||
|
||||
For example, to trace a run of `hello_triangle`, assuming the apitrace executables are in `$PATH`:
|
||||
|
||||
```
|
||||
gn args out/Debug # add "angle_link_glx = true"
|
||||
# edit samples/BUILD.gn and append "_static" to "angle_util", "libEGL", "libGLESv2"
|
||||
ninja -C out/Debug
|
||||
export TRACE_LIBGL="/usr/lib/libGL.so.1" # may require a different path
|
||||
apitrace trace -o mytrace ./out/Debug/hello_triangle
|
||||
qapitrace mytrace
|
||||
```
|
||||
|
||||
## Enabling General Logging
|
||||
|
||||
Normally, ANGLE only logs errors and warnings (e.g. to Android logcat). General logging, or
|
||||
additional levels of "trace" messages will be logged when the following GN arg is set:
|
||||
```
|
||||
angle_enable_trace = true
|
||||
```
|
||||
|
||||
To log all GLES and EGL commands submitted by an application, including the following flag:
|
||||
```
|
||||
angle_enable_trace_events = true
|
||||
```
|
||||
|
||||
## Debug Angle on Android
|
||||
|
||||
Android is built as an Android APK, which makes it more difficult to debug an APK that is using ANGLE. The following information can allow you to debug ANGLE with LLDB.
|
||||
* You need to build ANGLE with debug symbols enabled. Assume your build variant is called Debug. Make sure you have these lines in out/Debug/args.gn
|
||||
```
|
||||
is_component_build = false
|
||||
is_debug = true
|
||||
is_official_build = false
|
||||
symbol_level = 2
|
||||
strip_debug_info = false
|
||||
ignore_elf32_limitations = true
|
||||
angle_extract_native_libs = true
|
||||
```
|
||||
The following local patch may also be necessary:
|
||||
```
|
||||
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni
|
||||
index 96a18d91a3f6..ca7971fdfd48 100644
|
||||
--- a/build/config/compiler/compiler.gni
|
||||
+++ b/build/config/compiler/compiler.gni
|
||||
@@ -86,7 +86,8 @@ declare_args() {
|
||||
# Whether an error should be raised on attempts to make debug builds with
|
||||
# is_component_build=false. Very large debug symbols can have unwanted side
|
||||
# effects so this is enforced by default for chromium.
|
||||
- forbid_non_component_debug_builds = build_with_chromium
|
||||
+ forbid_non_component_debug_builds = false
|
||||
```
|
||||
|
||||
Build/install/enable ANGLE apk for your application following other instructions.
|
||||
* Modify gdbclient.py script to let it find the ANGLE symbols.
|
||||
```
|
||||
diff --git a/scripts/gdbclient.py b/scripts/gdbclient.py
|
||||
index 61fac4000..1f43f4f64 100755
|
||||
--- a/scripts/gdbclient.py
|
||||
+++ b/scripts/gdbclient.py
|
||||
@@ -395,6 +395,8 @@ def generate_setup_script(debugger_path, sysroot, linker_search_dir, binary_file
|
||||
vendor_paths = ["", "hw", "egl"]
|
||||
solib_search_path += [os.path.join(symbols_dir, x) for x in symbols_paths]
|
||||
solib_search_path += [os.path.join(vendor_dir, x) for x in vendor_paths]
|
||||
+ solib_search_path += ["/your_path_to_chromium_src/out/Debug/lib.unstripped/"]
|
||||
if linker_search_dir is not None:
|
||||
solib_search_path += [linker_search_dir]
|
||||
```
|
||||
* Start your lldbclient.py from `/your_path_to_chromium_src/out/Debug` folder. This adds the ANGLE source-file paths to what is visible to LLDB, which allows LLDB to show ANGLE's source files. Refer to https://source.android.com/devices/tech/debug/gdb for how to attach the app for debugging.
|
||||
* If you are debugging angle_perftests, you can use `--shard-timeout 100000000` to disable the timeout so that the test won't get killed while you are debugging. If the test runs too fast that you don't have time to attach, use `--delay-test-start=60` to give you extra time to attach.
|
||||
|
||||
## Enabling Debug-Utils Markers
|
||||
|
||||
ANGLE can emit debug-utils markers for every GLES API command that are visible to both Android GPU
|
||||
Inspector (AGI) and RenderDoc. This support requires
|
||||
[enabling general logging](#enabling-general-logging) as well as setting the following additional
|
||||
GN arg:
|
||||
```
|
||||
angle_enable_annotator_run_time_checks = true
|
||||
```
|
||||
In addition, if the following GN arg is set, the API calls will output to Android's logcat:
|
||||
```
|
||||
angle_enable_trace_android_logcat = true
|
||||
```
|
||||
Once compiled, the markers need to be turned on.
|
||||
|
||||
### Turning on Debug Markers on Android
|
||||
|
||||
On Android, debug markers are turned on and off with an Android debug property that is
|
||||
automatically deleted at the next reboot:
|
||||
|
||||
```
|
||||
adb shell setprop debug.angle.markers 1
|
||||
```
|
||||
|
||||
* 0: Turned off/disabled (default)
|
||||
* 1: Turned on/enabled
|
||||
|
||||
### Turning on Debug Markers on Desktop
|
||||
|
||||
On desktop, debug markers are turned on and off with the ANGLE_ENABLE_DEBUG_MARKERS environment
|
||||
variable (set in OS-specific manner):
|
||||
|
||||
* 0: Turned off/disabled (default)
|
||||
* 1: Turned on/enabled
|
||||
|
||||
|
||||
## Running ANGLE under GAPID on Linux
|
||||
|
||||
[GAPID](https://github.com/google/gapid) can be used to capture trace of Vulkan commands on Linux.
|
||||
When capturing traces of gtest based tests built inside Chromium checkout, make sure to run the
|
||||
tests with `--single-process-tests` argument.
|
||||
|
||||
## Running ANGLE under GAPID on Android
|
||||
|
||||
[GAPID](https://github.com/google/gapid) can be used to capture a trace of the Vulkan or OpenGL ES
|
||||
command stream on Android. For it to work, ANGLE's libraries must have different names from the
|
||||
system OpenGL libraries. This is done with the gn arg:
|
||||
|
||||
```
|
||||
angle_libs_suffix = "_ANGLE_DEV"
|
||||
```
|
||||
|
||||
All
|
||||
[AngleNativeTest](https://chromium.googlesource.com/chromium/src/+/main/third_party/angle/src/tests/test_utils/runner/android/java/src/com/android/angle/test/AngleNativeTest.java)
|
||||
based tests share the same activity name, `com.android.angle.test.AngleUnitTestActivity`.
|
||||
Thus, prior to capturing your test trace, the specific test APK must be installed on the device.
|
||||
When you build the test, a test launcher is generated, for example,
|
||||
`./out/Release/bin/run_angle_end2end_tests`. The best way to install the APK is to run this test
|
||||
launcher once.
|
||||
|
||||
In GAPID's "Capture Trace" dialog, "Package / Action:" should be:
|
||||
|
||||
```
|
||||
android.intent.action.MAIN:com.android.angle.test/com.android.angle.test.AngleUnitTestActivity
|
||||
```
|
||||
|
||||
The mandatory [extra intent
|
||||
argument](https://developer.android.com/studio/command-line/adb.html#IntentSpec) for starting the
|
||||
activity is `org.chromium.native_test.NativeTest.StdoutFile`. Without it the test APK crashes. Test
|
||||
filters can be specified via either the `org.chromium.native_test.NativeTest.CommandLineFlags` or
|
||||
the `org.chromium.native_test.NativeTest.GtestFilter` argument. Example "Intent Arguments:" values in
|
||||
GAPID's "Capture Trace" dialog:
|
||||
|
||||
```
|
||||
-e org.chromium.native_test.NativeTest.StdoutFile /sdcard/chromium_tests_root/out.txt -e org.chromium.native_test.NativeTest.CommandLineFlags "--gtest_filter=*ES2_VULKAN"
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
-e org.chromium.native_test.NativeTest.StdoutFile /sdcard/chromium_tests_root/out.txt --e org.chromium.native_test.NativeTest.GtestFilter RendererTest.SimpleOperation/ES2_VULKAN:SimpleOperationTest.DrawWithTexture/ES2_VULKAN
|
||||
```
|
||||
|
||||
## Running ANGLE under RenderDoc
|
||||
|
||||
An application running through ANGLE can confuse [RenderDoc](https://github.com/baldurk/renderdoc),
|
||||
as RenderDoc [hooks to EGL](https://github.com/baldurk/renderdoc/issues/1045) and ends up tracing
|
||||
the calls the application makes, instead of the calls ANGLE makes to its backend. As ANGLE is a
|
||||
special case, there's little support for it by RenderDoc, though there are workarounds.
|
||||
|
||||
### Windows
|
||||
|
||||
On Windows, RenderDoc supports setting the environment variable `RENDERDOC_HOOK_EGL` to 0 to avoid
|
||||
this issue.
|
||||
|
||||
### Linux
|
||||
|
||||
On Linux, there is no supported workaround by RenderDoc. See [this
|
||||
issue](https://github.com/baldurk/renderdoc/issues/1045#issuecomment-463999869). To capture Vulkan
|
||||
traces, the workaround is to build RenderDoc without GL(ES) support.
|
||||
|
||||
Building RenderDoc is straightforward. However, here are a few instructions to keep in mind.
|
||||
|
||||
```
|
||||
# Install dependencies based on RenderDoc document. Here are some packages that are unlikely to be already installed:
|
||||
$ sudo apt install libxcb-keysyms1-dev python3-dev qt5-qmake libqt5svg5-dev libqt5x11extras5-dev
|
||||
|
||||
# Inside the RenderDoc directory:
|
||||
$ cmake -DCMAKE_BUILD_TYPE=Release -Bbuild -H. -DENABLE_GLES=OFF -DENABLE_GL=OFF
|
||||
|
||||
# QT_SELECT=5 is necessary if your distribution doesn't default to Qt5
|
||||
$ QT_SELECT=5 make -j -C build
|
||||
|
||||
# Run RenderDoc from the build directory:
|
||||
$ ./build/bin/qrenderdoc
|
||||
```
|
||||
|
||||
If your distribution does not provide a recent Vulkan SDK package, you would need to manually
|
||||
install that. This script tries to perform this installation as safely as possible. It would
|
||||
overwrite the system package's files, so follow at your own risk. Place this script just above the
|
||||
extracted SDK directory.
|
||||
|
||||
```
|
||||
#! /bin/bash
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Usage: $0 <version>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ver=$1
|
||||
|
||||
if [ ! -d "$ver" ]; then
|
||||
echo "$ver is not a directory"
|
||||
fi
|
||||
|
||||
# Verify everything first
|
||||
echo "Verifying files..."
|
||||
echo "$ver"/x86_64/bin/vulkaninfo
|
||||
test -f "$ver"/x86_64/bin/vulkaninfo || exit 1
|
||||
echo "$ver"/x86_64/etc/explicit_layer.d/
|
||||
test -d "$ver"/x86_64/etc/explicit_layer.d || exit 1
|
||||
echo "$ver"/x86_64/lib/
|
||||
test -d "$ver"/x86_64/lib || exit 1
|
||||
|
||||
echo "Verified. Performing copy..."
|
||||
|
||||
echo sudo cp "$ver"/x86_64/bin/vulkaninfo /usr/bin/vulkaninfo
|
||||
sudo cp "$ver"/x86_64/bin/vulkaninfo /usr/bin/vulkaninfo
|
||||
echo sudo cp "$ver"/x86_64/etc/explicit_layer.d/* /etc/explicit_layer.d/
|
||||
sudo cp "$ver"/x86_64/etc/explicit_layer.d/* /etc/explicit_layer.d/
|
||||
echo sudo rm /usr/lib/x86_64-linux-gnu/libvulkan.so*
|
||||
sudo rm /usr/lib/x86_64-linux-gnu/libvulkan.so*
|
||||
echo sudo cp -P "$ver"/x86_64/lib/lib* /usr/lib/x86_64-linux-gnu/
|
||||
sudo cp -P "$ver"/x86_64/lib/lib* /usr/lib/x86_64-linux-gnu/
|
||||
|
||||
echo "Done."
|
||||
```
|
||||
|
||||
### Android
|
||||
#### Using Linux as a Local Machine
|
||||
|
||||
If you are on Linux, make sure not to use the build done in the previous section. The GL renderer
|
||||
disabled in the previous section is actually needed in this section.
|
||||
|
||||
```
|
||||
# Inside the RenderDoc directory:
|
||||
# First delete the Cmake Cache in build/ directory
|
||||
rm build/CMakeCache.txt
|
||||
|
||||
# Then build RenderDoc with cmake:
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -Bbuild -H.
|
||||
QT_SELECT=5 make -j -C build
|
||||
```
|
||||
|
||||
Follow
|
||||
[Android Dependencies on Linux](https://github.com/baldurk/renderdoc/blob/v1.x/docs/CONTRIBUTING/Dependencies.md#android-dependencies-on-linux)
|
||||
to download dependency files.
|
||||
|
||||
Define the following environment variables, for example in `.bashrc` (values are examples):
|
||||
|
||||
```
|
||||
export JAVA_HOME=<path_to_jdk_root>
|
||||
export ANDROID_SDK=<path_to_sdk_root>
|
||||
export ANDROID_NDK=<path_to_ndk_root>
|
||||
export ANDROID_NDK_HOME=<path_to_ndk_root>
|
||||
```
|
||||
|
||||
In the renderdoc directory, create Android builds of RenderDoc:
|
||||
|
||||
```
|
||||
mkdir build-android-arm32
|
||||
cd build-android-arm32/
|
||||
cmake -DBUILD_ANDROID=On -DANDROID_ABI=armeabi-v7a ..
|
||||
make -j
|
||||
cd ../
|
||||
|
||||
mkdir build-android-arm64
|
||||
cd build-android-arm64/
|
||||
cmake -DBUILD_ANDROID=On -DANDROID_ABI=arm64-v8a ..
|
||||
make -j
|
||||
cd ../
|
||||
```
|
||||
|
||||
Note that you need both arm32 and arm64 builds even if working with an arm64 device. See
|
||||
[RenderDoc's documentation](https://github.com/baldurk/renderdoc/blob/v1.x/docs/CONTRIBUTING/Compiling.md#android)
|
||||
for more information.
|
||||
|
||||
When you run RenderDoc, choose the "Replay Context" from the bottom-left part of the UI (defaults to
|
||||
Local). When selecting the device, you should see the RenderDoc application running.
|
||||
|
||||
In ANGLE itself, make sure you add a suffix for its names to be different from the system's. Add
|
||||
this to gn args:
|
||||
|
||||
```
|
||||
angle_libs_suffix = "_ANGLE_DEV"
|
||||
```
|
||||
|
||||
Next, you need to install an ANGLE test APK. When you build the test, a test launcher is generated,
|
||||
for example, `./out/Release/bin/run_angle_end2end_tests`. The best way to install the APK is to run
|
||||
this test launcher once.
|
||||
|
||||
In RenderDoc, use `com.android.angle.test/com.android.angle.test.AngleUnitTestActivity` as the
|
||||
Executable Path, and provide the following arguments:
|
||||
|
||||
```
|
||||
-e org.chromium.native_test.NativeTest.StdoutFile /sdcard/chromium_tests_root/out.txt -e org.chromium.native_test.NativeTest.CommandLineFlags "--gtest_filter=*ES2_VULKAN"
|
||||
```
|
||||
|
||||
Note that in the above, only a single command line argument is supported with RenderDoc. If testing
|
||||
dEQP on a non-default platform, the easiest way would be to modify `GetDefaultAPIName()` in
|
||||
`src/tests/deqp_support/angle_deqp_gtest.cpp` (and avoid `--use-angle=X`).
|
||||
|
||||
|
||||
#### Using Windows as a Local Machine
|
||||
You should be able to download the latest [RenderDoc on Windows](https://renderdoc.org/builds) and follow the
|
||||
[RenderDoc Official Documentation](https://renderdoc.org/docs/how/how_android_capture.html) for instructions on how to
|
||||
use RenderDoc on Android. If you would like to build RenderDoc for Android on Windows yourself, you can follow the
|
||||
[RenderDoc Officual Documentation](https://github.com/baldurk/renderdoc/blob/v1.x/docs/CONTRIBUTING/Compiling.md#android).
|
||||
We listed more detailed instructions below on how to set up the build on Windows.
|
||||
|
||||
##### Install Android Dependencies
|
||||
|
||||
On windows, we need to install dependencies to build android, as described in
|
||||
[RenderDoc Official Documentation](https://github.com/baldurk/renderdoc/blob/v1.x/docs/CONTRIBUTING/Dependencies.md#android)
|
||||
1. Install [Android SDK](https://developer.android.com/about/versions/12/setup-sdk#install-sdk).
|
||||
|
||||
Add a new system variable:
|
||||
|
||||
Variable: ANDROID_SDK
|
||||
|
||||
Value: path_to_sdk_directory (e.g. C:\Users\test\Appdata\Local\Android\Sdk)
|
||||
2. Install [Android NDK](https://developer.android.com/studio/projects/install-ndk).
|
||||
|
||||
Add a new system variable:
|
||||
|
||||
Variable: ANDROID_NDK
|
||||
|
||||
Value: path_to_ndk_directory (e.g. C:\Users\test\Appdata\Local\Android\Sdk\ndk\23.1.7779620)
|
||||
|
||||
3. Install [Java 8](https://www.oracle.com/java/technologies/downloads/#java8).
|
||||
|
||||
Add a new system variable:
|
||||
|
||||
Variable: JAVA_HOME
|
||||
|
||||
Value: path_to_jdk1.8_directory (e.g. C:\Program Files\Java\jdk1.8.0_311)
|
||||
|
||||
5. Install [Android Debug Bridge](https://developer.android.com/studio/releases/platform-tools).
|
||||
|
||||
Append android_sdk_platform-tools_directory to the Path system variable.
|
||||
|
||||
e.g. C:\Users\Test\AppData\Local\Android\Sdk\platform-tools
|
||||
|
||||
|
||||
##### Install Build Tools
|
||||
|
||||
1. Install a bash shell. Git Bash comes with Git installation on Windows should work.
|
||||
2. Install [make](http://gnuwin32.sourceforge.net/packages/make.htm).
|
||||
Add the path to bin folder of GnuWin32 to the Path system variable.
|
||||
|
||||
|
||||
##### Build RenderDoc Android APK on Windows
|
||||
|
||||
If you are using the Git Bash that comes with MinGW generator, you can run below commands to build Android APK
|
||||
```
|
||||
mkdir build-android-arm32
|
||||
cd build-android-arm32/
|
||||
cmake -DBUILD_ANDROID=On -DANDROID_ABI=armeabi-v7a -G "MinGW Makefiles" ..
|
||||
make -j
|
||||
cd ../
|
||||
|
||||
mkdir build-android-arm64
|
||||
cd build-android-arm64/
|
||||
cmake -DBUILD_ANDROID=On -DANDROID_ABI=arm64-v8a -G "MinGW Makefiles" ..
|
||||
make -j
|
||||
cd ../
|
||||
```
|
||||
If the generator type of the bash shell you are using is different from MinGW, replace the "MinGW" in the above cmake
|
||||
command with the generator
|
||||
type you are using, as described in
|
||||
[RenderDoc Official Documentation](https://github.com/baldurk/renderdoc/blob/v1.x/docs/CONTRIBUTING/Compiling.md#android).
|
||||
|
||||
|
||||
##### Build Errors And Resolutions
|
||||
|
||||
* **cmake command errors**
|
||||
|
||||
```
|
||||
Error: Failed to run MSBuild command:
|
||||
C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/MSBuild/Current/Bin/MSBuild.exe to get the value of
|
||||
VCTargetsPath:
|
||||
error : The BaseOutputPath/OutputPath property is not set for project 'VCTargetsPath.vcxproj'.
|
||||
Please check to make sure that you have specified a valid combination of Configuration and Platform for this project.
|
||||
Configuration='Debug' Platform='x64'.
|
||||
```
|
||||
|
||||
This is due to the cmake command is using Visual Studio as the generator type. Run the cmake command with the
|
||||
generator type "MinGW Makefiles" or "MSYS Makefiles".
|
||||
|
||||
```Error: Does not match the generator used previously```
|
||||
|
||||
|
||||
|
||||
Delete the CMakeCache file in build directories build-android-arm64/ or build-android-arm32/.
|
||||
|
||||
|
||||
* **make command errors**
|
||||
|
||||
```
|
||||
-Djava.ext.dirs is not supported.
|
||||
Error: Could not create the Java Virtual Machine.
|
||||
Error: A fatal exception has occurred. Program will exit.
|
||||
|
||||
```
|
||||
|
||||
Downgrade Java JDK version to [Java 8](https://www.oracle.com/java/technologies/downloads/#java8).
|
||||
|
||||
|
||||
##### Steps to use the RenderDoc you just built
|
||||
1. Build arm32 and arm64 android packages. See [instructions](#build-renderdoc-android-apk-on-windows) in the above
|
||||
section.
|
||||
|
||||
2. Uninstall the renderdoc package.
|
||||
|
||||
This step is required if you have installed / used RenderDoc on the same Android device before. RenderDoc only pushes
|
||||
the renderdoccmd APK to the Android device if it finds the version of the existing APK on the device is different from
|
||||
the version of the APK we are going to install, and the version is dictated by the git hash it was built from. Therefore
|
||||
any local modifications in the RenderDoc codebase would not get picked up if we don't uninstall the old APK first.
|
||||
|
||||
```
|
||||
adb uninstall org.renderdoc.renderdoccmd.arm64
|
||||
adb uninstall org.renderdoc.renderdoccmd.arm32
|
||||
```
|
||||
3. Build renderdoc on windows desktop by clicking "build solution" in visual studio.
|
||||
4. Launch renderdoc from visual studio, and push the android packages to android device by selecting the connected
|
||||
device at the bottom left corner.
|
||||
|
||||
### Add SPIRV-to-GLSL Shader View Option
|
||||
RenderDoc allows us to add and configure customized shader processing tools:
|
||||
https://renderdoc.org/docs/window/settings_window.html#shader-processing-tools-config.
|
||||
|
||||
To configure RenderDoc to display shader source code in GLSL, instead of spirv,
|
||||
follow the below steps:
|
||||
|
||||
|
||||
1. Get the SPIRV-Cross tool:
|
||||
|
||||
Clone the SPIRV-Cross git repo: https://github.com/KhronosGroup/SPIRV-Cross:
|
||||
```
|
||||
git clone https://github.com/KhronosGroup/SPIRV-Cross.git
|
||||
```
|
||||
Compile the SPIRV-Cross:
|
||||
```
|
||||
# inside SPIRV-Cross directory
|
||||
make
|
||||
```
|
||||
2. Open Shader Viewer Settings window: RenderDoc -> Tools -> Settings, and select
|
||||
Shader Viewer on the left.
|
||||
3. Click Add on the bottom to add a new tool, and fill the new tool details:
|
||||
|
||||
| Item | Value |
|
||||
|------------|-------------------------------------|
|
||||
| Name | SPIRV-CROSS |
|
||||
| Tool Type | SPIRV-Cross |
|
||||
| Executable | <spirv-cross-repo-root>/spirv-cross |
|
||||
|
||||
5. Restart RenderDoc.
|
||||
|
||||
## Testing with Chrome Canary
|
||||
|
||||
Many of ANGLE's OpenGL ES entry points are exposed in Chromium as WebGL 1.0 and WebGL 2.0 APIs that
|
||||
are available via JavaScript. For testing purposes, custom ANGLE builds may be injected in Chrome
|
||||
Canary.
|
||||
|
||||
### Setup
|
||||
|
||||
#### Windows
|
||||
|
||||
1. Download and install [Google Chrome Canary](https://www.google.com/chrome/canary/).
|
||||
2. Build ANGLE x64, Release.
|
||||
3. Run `python scripts\update_chrome_angle.py` to replace Canary's ANGLE with your custom ANGLE
|
||||
(note: Canary must be closed).
|
||||
|
||||
#### Linux
|
||||
|
||||
1. Install Google Chrome Dev (via apt, or otherwise). Expected installation directory is
|
||||
`/opt/google/chrome-unstable`.
|
||||
2. Build ANGLE for the running platform. `is_component_build = false` is suggested in the GN args.
|
||||
3. Run `python scripts/update_chrome_angle.py` to replace Dev's ANGLE with your custom ANGLE
|
||||
4. Add ANGLE's build path to the `LD_LIBRARY_PATH` environment variable.
|
||||
|
||||
#### macOS
|
||||
|
||||
1. Download and install [Google Chrome Canary](https://www.google.com/chrome/canary/).
|
||||
2. Build ANGLE for the running platform; GN args should contain `is_debug = false`.
|
||||
3. Run `./scripts/update_chrome_angle.py` to replace Canary's ANGLE with your custom ANGLE.
|
||||
|
||||
### Usage
|
||||
|
||||
Run Chrome:
|
||||
|
||||
- On Windows: `%LOCALAPPDATA%\Google\Chrome SxS\chrome.exe`
|
||||
- On Linux: `/opt/google/chrome-unstable/google-chrome-unstable`
|
||||
- On macOS: `./Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary`
|
||||
|
||||
With the following command-line options:
|
||||
|
||||
* `--use-cmd-decoder=passthrough --use-gl=angle` and one of
|
||||
* `--use-angle=d3d9` (Direct3D 9 renderer, Windows only)
|
||||
* `--use-angle=d3d11` (Direct3D 11 renderer, Windows only)
|
||||
* `--use-angle=d3d11on12` (Direct3D 11on12 renderer, Windows only)
|
||||
* `--use-angle=gl` (OpenGL renderer)
|
||||
* `--use-angle=gles` (OpenGL ES renderer)
|
||||
* `--use-angle=vulkan` (Vulkan renderer)
|
||||
* `--use-angle=swiftshader` (SwiftShader renderer)
|
||||
* `--use-angle=metal` (Metal renderer, macOS only)
|
||||
|
||||
Additional useful options:
|
||||
|
||||
* `--enable-logging`: To see logs
|
||||
* `--disable-gpu-watchdog`: To disable Chromium's watchdog, killing the GPU process when slow (due
|
||||
to a debug build for example)
|
||||
* `--disable-gpu-sandbox`: To disable Chromium's sandboxing features, if it's getting in the way of
|
||||
testing.
|
||||
* `--disable-gpu-compositing`: To make sure only the WebGL test being debugged is run through ANGLE,
|
||||
not the entirety of Chromium.
|
||||
216
doc/DevSetup.md
216
doc/DevSetup.md
@@ -1,216 +0,0 @@
|
||||
# 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/documentation](http://git-scm.com/documentation).
|
||||
|
||||
### Required First Setup (do this first)
|
||||
|
||||
Note: If you are building inside a Chromium checkout [see these instructions instead](https://chromium.googlesource.com/angle/angle/+/HEAD/doc/BuildingAngleForChromiumDevelopment.md).
|
||||
|
||||
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:
|
||||
|
||||
* 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.
|
||||
|
||||
After this 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)
|
||||
```
|
||||
|
||||
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) by setting
|
||||
`target_os = "winuwp"` in the args. 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` with UWP.
|
||||
|
||||
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 Goma (Google employees only)
|
||||
|
||||
In addition, we highly recommend Google employees use goma, a distributed
|
||||
compilation system. Detailed information is available internally. To enable
|
||||
Goma set the GN arg:
|
||||
|
||||
```
|
||||
use_goma = 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).
|
||||
|
||||
## 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.
|
||||
@@ -1,265 +0,0 @@
|
||||
# ANGLE for Android
|
||||
|
||||
**Important note**: Android builds currently require Linux.
|
||||
|
||||
## Setting up the ANGLE build for Android
|
||||
|
||||
Please follow the instructions in [DevSetup](DevSetup.md) to check out and bootstrap ANGLE with
|
||||
gclient. Then edit your `.gclient` to add `target_os = ['android']` to check out Android
|
||||
dependencies. Then run `gclient sync` to download all required sources and packages.
|
||||
|
||||
The following command will open a text editor to populate GN args for an Android Release build:
|
||||
```
|
||||
gn args out/Android
|
||||
```
|
||||
|
||||
Once the editor is up, paste the following GN args to generate an Android build, and save the file.
|
||||
```
|
||||
target_os = "android"
|
||||
target_cpu = "arm64"
|
||||
is_component_build = false
|
||||
is_debug = false
|
||||
angle_assert_always_on = true # Recommended for debugging. Turn off for performance.
|
||||
use_goma = true # Googlers-only! If you're not a Googler remove this.
|
||||
```
|
||||
|
||||
More targeted GN arg combinations can be found [below](#android-gn-args-combinations).
|
||||
|
||||
If you run into any problems with the above, you can copy the canonical args from CI:
|
||||
- Visit the ANGLE [CI Waterfall](https://ci.chromium.org/p/angle/g/ci/console).
|
||||
- Open any recent Android build.
|
||||
- Expand the for "lookup GN args" step and copy the GN args.
|
||||
- Always omit the `goma_dir` flag.
|
||||
- If you are not a Googler, also omit the `use_goma` flag.
|
||||
|
||||
## Building ANGLE for Android
|
||||
|
||||
Build all ANGLE targets using the following command:
|
||||
|
||||
```
|
||||
autoninja -C out/Android
|
||||
```
|
||||
|
||||
Most ANGLE build targets are supported. We do not support the ANGLE samples on
|
||||
Android currently. ANGLE tests will be in your `out/Android` directory, and can
|
||||
be run with various options. For instance, angle perftests can be run with:
|
||||
|
||||
```
|
||||
./out/Android/angle_perftests --verbose --local-output --gtest_filter=DrawCallPerf*
|
||||
```
|
||||
|
||||
Additional details are in [Android Test Instructions][AndroidTest].
|
||||
|
||||
Additional Android dEQP notes can be found in [Running dEQP on Android](dEQP.md#Running-dEQP-on-Android).
|
||||
|
||||
If you are targeting WebGL and want to run with ANGLE, you will need to build within a full
|
||||
Chromium checkout. Please follow the [Chromium build instructions for Android][ChromeAndroid].
|
||||
Also refer to the [ANGLE Guide][ANGLEChrome] on how to work with Top of Tree ANGLE in Chromium.
|
||||
Build the `chrome_public_apk` target, and follow the [GPU Testing][GPU Testing] doc, using
|
||||
`--browser=android-chromium`. Make sure to set your `CHROMIUM_OUT_DIR` environment variable, so
|
||||
that your browser is found, otherwise the tests will use the stock browser.
|
||||
|
||||
[AndroidTest]: https://chromium.googlesource.com/chromium/src/+/main/docs/testing/android_test_instructions.md
|
||||
[GPU Testing]: http://www.chromium.org/developers/testing/gpu-testing#TOC-Running-the-GPU-Tests-Locally
|
||||
[ChromeAndroid]: https://chromium.googlesource.com/chromium/src/+/main/docs/android_build_instructions.md
|
||||
[ANGLEChrome]: BuildingAngleForChromiumDevelopment.md
|
||||
|
||||
## Using ANGLE as the Android OpenGL ES driver
|
||||
|
||||
Starting with Android 10 (Q), you can load ANGLE as your device's OpenGL ES driver.
|
||||
|
||||
`== Important Note ==` You can only run this ANGLE with *DEBUGGABLE APPS* or when you have
|
||||
*ROOT ACCESS*. Debuggable apps are [marked debuggable][Debuggable] in the manifest. For root
|
||||
access, see the [Android documentation][UserDebug] for how to build from source.
|
||||
|
||||
To build the ANGLE APK, you must first bootstrap your build by following the steps
|
||||
[above](#ANGLE-for-Android). The steps below will result in an APK that contains the ANGLE
|
||||
libraries and can be installed on any Android 10+ build.
|
||||
|
||||
Apps can be opted in to ANGLE [one at a time](#ANGLE-for-a-single-OpenGL-ES-app), in
|
||||
[groups](#ANGLE-for-multiple-OpenGL-ES-apps), or [globally](#ANGLE-for-all-OpenGL-ES-apps). The
|
||||
apps must be launched by the Java runtime since the libraries are discovered within an installed
|
||||
package. This means ANGLE cannot be used by native executables or SurfaceFlinger at this time.
|
||||
|
||||
## Building the ANGLE APK
|
||||
|
||||
Using `gn args` from above, you can build the ANGLE apk using:
|
||||
```
|
||||
autoninja -C out/Android angle_apks
|
||||
```
|
||||
|
||||
## Installing the ANGLE APK
|
||||
|
||||
```
|
||||
adb install -r -d --force-queryable out/Android/apks/AngleLibraries.apk
|
||||
```
|
||||
You can verify installation by looking for the package name:
|
||||
```
|
||||
$ adb shell pm path org.chromium.angle
|
||||
package:/data/app/org.chromium.angle-HpkUceNFjoLYKPbIVxFWLQ==/base.apk
|
||||
```
|
||||
|
||||
Note that `angle_debug_package` must be set to `org.chromium.angle` for this apk to be loaded.
|
||||
|
||||
## Selecting ANGLE as the OpenGL ES driver
|
||||
|
||||
For debuggable applications or root users, you can tell the platform to load ANGLE libraries from
|
||||
the installed package.
|
||||
```
|
||||
adb shell settings put global angle_debug_package org.chromium.angle
|
||||
```
|
||||
Remember that ANGLE can only be used by applications launched by the Java runtime.
|
||||
|
||||
## ANGLE driver choices
|
||||
|
||||
There are multiple values you can use for selecting which OpenGL ES driver is loaded by the platform.
|
||||
|
||||
The following values are supported for `angle_gl_driver_selection_values`:
|
||||
- `angle` : Use ANGLE.
|
||||
- `native` : Use the native OpenGL ES driver.
|
||||
- `default` : Use the default driver. This allows the platform to decide which driver to use.
|
||||
|
||||
In each section below, replace `<driver>` with one of the values above.
|
||||
|
||||
### ANGLE for a *single* OpenGL ES app
|
||||
|
||||
```
|
||||
adb shell settings put global angle_gl_driver_selection_pkgs <package name>
|
||||
adb shell settings put global angle_gl_driver_selection_values <driver>
|
||||
```
|
||||
|
||||
### ANGLE for *multiple* OpenGL ES apps
|
||||
|
||||
Similar to selecting a single app, you can select multiple applications by listing their package
|
||||
names and driver choice in comma separated lists. Note the lists must be the same length, one
|
||||
driver choice per package name.
|
||||
```
|
||||
adb shell settings put global angle_gl_driver_selection_pkgs <package name 1>,<package name 2>,<package name 3>,...
|
||||
adb shell settings put global angle_gl_driver_selection_values <driver 1>,<driver 2>,<driver 3>,...
|
||||
```
|
||||
|
||||
### ANGLE for *all* OpenGL ES apps
|
||||
|
||||
`Note: This method only works on a device with root access.`
|
||||
|
||||
Enable:
|
||||
```
|
||||
adb shell settings put global angle_gl_driver_all_angle 1
|
||||
```
|
||||
Disable:
|
||||
```
|
||||
adb shell settings put global angle_gl_driver_all_angle 0
|
||||
```
|
||||
|
||||
## Check for success
|
||||
|
||||
Check to see that ANGLE was loaded by your application:
|
||||
```
|
||||
$ adb logcat -d | grep ANGLE
|
||||
V GraphicsEnvironment: ANGLE developer option for <package name>: angle
|
||||
I GraphicsEnvironment: ANGLE package enabled: org.chromium.angle
|
||||
I ANGLE : Version (2.1.0.f87fac56d22f), Renderer (Vulkan 1.1.87(Adreno (TM) 615 (0x06010501)))
|
||||
```
|
||||
|
||||
Note that this might be logged by the built-in ANGLE and not the installed apk if `angle_debug_package` wasn't set.
|
||||
|
||||
## Clean up
|
||||
|
||||
Settings persist across reboots, so it is a good idea to delete them when finished.
|
||||
```
|
||||
adb shell settings delete global angle_debug_package
|
||||
adb shell settings delete global angle_gl_driver_all_angle
|
||||
adb shell settings delete global angle_gl_driver_selection_pkgs
|
||||
adb shell settings delete global angle_gl_driver_selection_values
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
If your application is not debuggable or you are not root, you may see an error like this in the log:
|
||||
```
|
||||
$ adb logcat -d | grep ANGLE
|
||||
V GraphicsEnvironment: ANGLE developer option for <package name>: angle
|
||||
E GraphicsEnvironment: Invalid number of ANGLE packages. Required: 1, Found: 0
|
||||
E GraphicsEnvironment: Failed to find ANGLE package.
|
||||
```
|
||||
Double check that you are root, or that your application is [marked debuggable][Debuggable].
|
||||
|
||||
## Android GN args combinations
|
||||
|
||||
The [above](#angle-gn-args-for-android) GN args only modify default values to generate a Debug
|
||||
build for Android. Below are some common configurations used for different scenarios.
|
||||
|
||||
To determine what is different from default, you can point the following command at your target
|
||||
directory. It will show the list of gn args in use, where they came from, their current value,
|
||||
and their default values.
|
||||
```
|
||||
gn args --list <dir>
|
||||
```
|
||||
|
||||
### Performance config
|
||||
|
||||
This config is designed to get maximum performance by disabling debug configs and validation layers.
|
||||
Note: The oddly named `is_official_build` is a more aggressive optimization level than `Release`. Its name is historical.
|
||||
```
|
||||
target_os = "android"
|
||||
target_cpu = "arm64"
|
||||
angle_enable_vulkan = true
|
||||
is_component_build = false
|
||||
is_official_build = true
|
||||
is_debug = false
|
||||
```
|
||||
|
||||
### Debug config
|
||||
|
||||
This config is useful for quickly ensuring Vulkan is running cleanly. It disables debug, but
|
||||
enables asserts and allows validation errors.
|
||||
```
|
||||
target_os = "android"
|
||||
target_cpu = "arm64"
|
||||
is_component_build = false
|
||||
is_debug = true
|
||||
```
|
||||
|
||||
#### Application Compatibility
|
||||
|
||||
Application compatibility may be increased by enabling non-conformant features and extensions with
|
||||
a GN arg:
|
||||
|
||||
```
|
||||
angle_expose_non_conformant_extensions_and_versions = true
|
||||
```
|
||||
|
||||
## Accessing ANGLE traces
|
||||
|
||||
To sync and build the ANGLE traces, jump to [ANGLE Restricted Traces](https://chromium.googlesource.com/angle/angle.git/+/HEAD/src/tests/restricted_traces/README.md#angle-restricted-traces).
|
||||
|
||||
## Command line for launching chrome on Android
|
||||
|
||||
[This Makefile](https://github.com/phuang/test/blob/main/chromium/Makefile) contains many useful
|
||||
command lines for launching chrome.
|
||||
|
||||
Targets run_chrome_public_apk_* is for launching chrome on Android.
|
||||
|
||||
To use this Makefile, download it into chrome build tree, and use below commands (for more targets please check Makefile)
|
||||
```
|
||||
# To edit gn args
|
||||
$ make args OUT=out_android/Release # The OUT can be set in Makefile instead of passing it in command line
|
||||
|
||||
# Build and run chrome on Android device with GLRenderer
|
||||
$ make run_chrome_public_apk_gl
|
||||
|
||||
# Build and run chrome on Android device with SkiaRenderer
|
||||
$ make run_chrome_public_apk_skia
|
||||
|
||||
# Run adb logcat
|
||||
$ make adb_logcat
|
||||
|
||||
# Symbolize Android crash stack
|
||||
$ make android_symbol
|
||||
|
||||
# Build and run gpu_unittests
|
||||
$ make gpu_unittests GTEST_FILTER="gtest-filters" # If GTEST_FILTER is not specified, all tests will be run.
|
||||
```
|
||||
|
||||
[Debuggable]: https://developer.android.com/guide/topics/manifest/application-element#debug
|
||||
[UserDebug]: https://source.android.com/setup/build/building
|
||||
111
doc/DirtyBits.md
111
doc/DirtyBits.md
@@ -1,111 +0,0 @@
|
||||
# Dirty Bits and State Changes
|
||||
|
||||
OpenGL render loops typically involve changing some render states followed by
|
||||
a draw call. For instance the app might change a few uniforms and invoke
|
||||
`glDrawElements`:
|
||||
|
||||
```
|
||||
for (const auto &obj : scene) {
|
||||
for (const auto &uni : obj.uniforms) {
|
||||
glUniform4fv(uni.loc, uni.data);
|
||||
}
|
||||
glDrawElements(GL_TRIANGLES, obj.eleCount, GL_UNSIGNED_SHORT, obj.eleOffset);
|
||||
}
|
||||
```
|
||||
|
||||
Another update loop may change Texture and Vertex Array state before the draw:
|
||||
|
||||
```
|
||||
for (const auto &obj : scene) {
|
||||
glBindBuffer(GL_ARRAY_BUFFER, obj.arrayBuffer);
|
||||
glBufferSubData(GL_ARRAY_BUFFER, obj.bufferOffset, obj.bufferSize, obj.bufferData);
|
||||
glVertexAttribPointer(obj.arrayIndex, obj.arraySize, GL_FLOAT, GL_FALSE, 0, nullptr);
|
||||
glBindTexture(GL_TEXTURE_2D, obj.texture);
|
||||
glDrawElements(GL_TRIANGLES, obj.eleCount, GL_UNSIGNED_SHORT, obj.eleOffset);
|
||||
}
|
||||
```
|
||||
|
||||
Other update loops may change render states like the blending modes, the depth test, or Framebuffer
|
||||
attachments. In each case ANGLE needs to validate, track, and translate these state changes to the
|
||||
back-end as efficiently as possible.
|
||||
|
||||
## Dirty Bits
|
||||
|
||||
Each OpenGL Context state value is stored in [`gl::State`](../src/libANGLE/State.h). For instance
|
||||
the blending state, depth/stencil state, and current object bindings. Our problem is deciding how to
|
||||
notify the back-end when app changes front-end state. We decided to bundle changed state into
|
||||
bitsets. Each 1 bit indicates a specific changed state value. We call these bitsets "*dirty bits*".
|
||||
See [`gl::State::DirtyBitType`][DirtyBitType].
|
||||
|
||||
Each back-end handles state changes in a `syncState` implementation function that takes a dirty
|
||||
bitset. See examples in the [GL back-end][GLSyncState], [D3D11 back-end][D3D11SyncState] and
|
||||
[Vulkan back-end][VulkanSyncState].
|
||||
|
||||
Container objects such as Vertex Array Objects and Framebuffers also have their own OpenGL front-end
|
||||
state. [VAOs][VAOState] store vertex arrays and array buffer bindings. [Framebuffers][FBOState]
|
||||
store attachment state and the active read and draw buffers. These containers also have internal
|
||||
dirty bits and `syncState` methods. See [`gl::Framebuffer::DirtyBitType`][FBODirtyBits] and
|
||||
[`rx::FramebufferVk::syncState`][FBOVkSyncState] for example.
|
||||
|
||||
Dirty bits allow us to efficiently process groups of state updates. We use fast instrinsic functions
|
||||
to scan the bitsets for 1 bits. See [`bitset_utils.h`](../src/common/bitset_utils.h) for more
|
||||
information.
|
||||
|
||||
## Cached Validation and State Change Notifications
|
||||
|
||||
To optimize validation we cache many checks. See [`gl::StateCache`][StateCache] for examples. We
|
||||
need to refresh cached values on state changes. For instance, enabling a generic vertex array
|
||||
changes a cached mask of active vertex arrays. Changes to a texture's images could change a cached
|
||||
framebuffer's completeness when the texture is bound as an attachment. And if the draw framebuffer
|
||||
becomes incomplete it changes a cached draw call validation check.
|
||||
|
||||
See a below example of a call to `glTexImage2D` that can affect draw call validation:
|
||||
|
||||
<!-- Generated from https://bramp.github.io/js-sequence-diagrams/
|
||||
participant App
|
||||
participant Context
|
||||
participant Framebuffer
|
||||
participant Texture
|
||||
App->Context: glTexImage2D
|
||||
Context->Texture: setImage
|
||||
Texture- ->Framebuffer: onSubjectStateChange
|
||||
Note over Framebuffer: cache update
|
||||
Framebuffer- ->Context: onSubjectStateChange
|
||||
Note over Context: cache update
|
||||
-->
|
||||
|
||||

|
||||
|
||||
We use the [Observer pattern](https://en.wikipedia.org/wiki/Observer_pattern) to implement cache
|
||||
invalidation notifications. See [`Observer.h`](../src/libANGLE/Observer.h). In the example the
|
||||
`Framebuffer` observes `Texture` attachments via [`angle::ObserverBinding`][ObserverBinding].
|
||||
`Framebuffer` implements [`angle::ObserverInterface::onSubjectStateChange`][FBOStateChange] to
|
||||
receive a notification to update its completeness cache. The `STORAGE_CHANGED` message triggers a
|
||||
call to [`gl::Context::onSubjectStateChange`][ContextStateChange] which in turn calls
|
||||
[`gl::StateCache::updateBasicDrawStatesError`][StateCacheUpdate] to re-validate the draw
|
||||
framebuffer's completeness. On subsequent draw calls we skip re-validation at minimal cost.
|
||||
|
||||
See the below diagram for the dependency relations between Subjects and Observers.
|
||||
|
||||

|
||||
|
||||
## Back-end specific Optimizations
|
||||
|
||||
See [Fast OpenGL State Transitions][FastStateTransitions] in [Vulkan documents][VulkanREADME] for
|
||||
additional information for how we implement state change optimization on the Vulkan back-end.
|
||||
|
||||
[DirtyBitType]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/State.h#483
|
||||
[GLSyncState]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/renderer/gl/StateManagerGL.cpp#1576
|
||||
[D3D11SyncState]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp#852
|
||||
[VulkanSyncState]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/renderer/vulkan/ContextVk.cpp#642
|
||||
[VAOState]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/VertexArray.h#35
|
||||
[FBOState]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/Framebuffer.h#52
|
||||
[FBODirtyBits]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/Framebuffer.h#319
|
||||
[FBOVkSyncState]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/renderer/vulkan/FramebufferVk.cpp#726
|
||||
[StateCache]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/Context.h#98
|
||||
[ObserverBinding]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/Observer.h#103
|
||||
[FBOStateChange]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/Framebuffer.cpp#1811
|
||||
[ContextStateChange]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/Context.cpp#7981
|
||||
[StateCacheUpdate]: https://chromium.googlesource.com/angle/angle/+/5f662c0042703344eb0eef6d1c123e902e3aefbf/src/libANGLE/Context.cpp#8190
|
||||
[FastStateTransitions]: ../src/libANGLE/renderer/vulkan/doc/FastOpenGLStateTransitions.md
|
||||
[VulkanREADME]: ../src/libANGLE/renderer/vulkan/README.md
|
||||
@@ -1,24 +0,0 @@
|
||||
# About
|
||||
|
||||
Because ANGLE can only generate full HLSL programs after we known the signatures
|
||||
between the vertex and pixel stages, we can not immediately call the D3D
|
||||
compiler at GL shader compile time. Moreover, we can insert additional
|
||||
optimization code right at draw-time.
|
||||
|
||||
ESSL 1.00 shaders treat all vertex inputs as floating point. We insert a
|
||||
conversion routine to transform un-normalized integer vertex attributes in the
|
||||
shader preamble to floating point, saving CPU conversion time.
|
||||
|
||||
At draw-time, we also optimize out any unused render target outputs. This
|
||||
improved draw call performance significantly on lower spec and integrated
|
||||
devices. Changing render target setups may trigger a shader recompile at draw
|
||||
time.
|
||||
|
||||
# Addendum
|
||||
|
||||
ANGLE is not the only program to do this kind of draw-time optimization. A
|
||||
common complaint from application developers is that draw calls sometimes
|
||||
perform very slowly due to dynamic shader re-compilation. A future design
|
||||
direction for ANGLE, when targeting a more modern API, is to perform the vertex
|
||||
conversion in a separate shader pass, which would then be linked with another
|
||||
compiled shader.
|
||||
@@ -1,22 +0,0 @@
|
||||
# ES1 Status
|
||||
|
||||
ES1 is implemented entirely in the front-end using features from GLES3.0. Therefore, every backend
|
||||
with GLES3 support (i.e. everything other than D3D9) supports GLES1 as well.
|
||||
|
||||
ANGLE passes GLES1's `MustPass`, however there are known missing features.
|
||||
|
||||
| Features | Status | Backends |
|
||||
|:-------------------------------------|:---------------------------------------------|:------------|
|
||||
| Logic Op | Implemented through extensions [1](#notes-1) | Vulkan, GL |
|
||||
| Palette compressed textures | Emulated with uncompressed format | Vulkan |
|
||||
| [Smooth lines][lines] | Unimplemented | None |
|
||||
| [Two-sided lighting][lighting] | Unimplemented | None |
|
||||
| [Matrix palette][matrix] | Unimplemented (optional) | None |
|
||||
|
||||
[lines]: http://anglebug.com/7950
|
||||
[lighting]: http://anglebug.com/7702
|
||||
[matrix]: http://anglebug.com/7951
|
||||
|
||||
### Notes [1]
|
||||
* Logic op is implemented through the `ANGLE_logic_op` or `EXT_framebuffer_fetch` extensions.
|
||||
* Currently, these are supported on the Vulkan and GL backends only.
|
||||
@@ -1,31 +0,0 @@
|
||||
# ES31 Status on Direct3D 11
|
||||
|
||||
| New Features | Status | Limitations |
|
||||
|:---------------------------------------------------|:-----------------------------|:------------|
|
||||
| Arrays of arrays (shading language only) | Fully implemented | None |
|
||||
| Compute shaders | Fully implemented | None |
|
||||
| Explicit uniform location | Fully implemented | None |
|
||||
| Framebuffers with no attachments | Fully implemented | None |
|
||||
| Indirect draw commands | Fully implemented | None |
|
||||
| Multisample formats for immutable textures | Fully implemented | None |
|
||||
| Program interface queries | Fully implemented | None |
|
||||
| Shader bitfield operations (shading language only) | Fully implemented | None |
|
||||
| Shader layout binding (shading language only) | Fully implemented | None |
|
||||
| Texture gather operations | Fully implemented | None |
|
||||
| Vertex attribute binding | Fully implemented | None |
|
||||
| Atomic counters | Implemented with limitations | Atomic counters in non-compute shaders are not implemented yet. |
|
||||
| Shader image load/store operations | Implemented with limitations | See notes [1] [below](#notes-1) |
|
||||
| Shader storage buffer objects | Implemented with limitations | See notes [2] [below](#notes-2) |
|
||||
| Shader helper invocation (shading language only) | Hard to implement | The equivalent of gl_HelperInvocation is WaveIsHelperLane which requres SM6. |
|
||||
| Separate shader objects | Unimplemented | It can be implemented with medium complexity. |
|
||||
| Stencil texturing | Unimplemented | It can be implemented with medium complexity. Refer [here](https://stackoverflow.com/questions/34601325/directx11-read-stencil-bit-from-compute-shader). |
|
||||
|
||||
### Notes [1]
|
||||
* Images in non-compute shaders are not implemented yet.
|
||||
* Multiple image variables are not allowed to be bound to the same image unit which refers to the same layer and level of a texture image. It means image aliasing is not supported.
|
||||
* The same layer and level of a texture are not allowed to be bound to multiple image units.
|
||||
* When a texture is bound to an image unit, the image unit format must exactly match the texture internal format. Similarly, the format layout qualifier for an image variable must exactly match the format of the image unit. Re-interpretation is not supported. See [here](http://anglebug.com/3038).
|
||||
|
||||
### Notes [2]
|
||||
* Shader storage blocks in non-compute shaders are not implemented yet.
|
||||
* Multiple shader storage blocks are not allowed to be bound to the same buffer. See [here](http://anglebug.com/3032).
|
||||
@@ -1,351 +0,0 @@
|
||||
# ANGLE Supported Extensions
|
||||
|
||||
This is a list of all extensions currently supported by ANGLE's front-end, and
|
||||
support listed for some of the tested targets for ANGLE's Vulkan back-end. To
|
||||
produce a list of all supported extensions in the Vulkan back-end, run
|
||||
`angle_end2end_tests` with `--gtest_filter EGLPrintEGLinfoTest.PrintGLInfo/ES*_Vulkan`.
|
||||
|
||||
Specifications for GLES extensions can be found in the [Khronos OpenGL ES API
|
||||
Registry](http://www.khronos.org/registry/gles/)
|
||||
|
||||
Specifications for EGL extensions can be found in the [Khronos EGL API
|
||||
Registry](http://www.khronos.org/registry/egl/)
|
||||
|
||||
Specifications for ANGLE-specific extensions can be found in the [ANGLE
|
||||
extension registry](../extensions)
|
||||
|
||||
This list is automatically generated by [`gen_extensions.py`](../src/libANGLE/gen_extensions.py)
|
||||
using data from registry_xml.py and gl.xml.
|
||||
|
||||
## GLES 2.0, 3.0, 3.1 and 3.2 extension support
|
||||
|
||||
*Note: some data is sampled from older drivers, so might not represent the latest driver support.*
|
||||
|
||||
| Extension Name | NVIDIA 1660 Win10 | Intel 630 Win10 | NVIDIA 1660 Linux | Intel 630 Linux | SwiftShader Win10 | Pixel 4 Android 11 | Pixel 6 Android 13 |
|
||||
| -------------- | :---------------: | :-------------: | :---------------: | :-------------: | :---------------: | :----------------: | :----------------: |
|
||||
| [GL_EXT_base_instance](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_base_instance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_KHR_blend_equation_advanced](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_blend_equation_advanced.txt) | ✔ | | ✔ | | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_blend_func_extended](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_blend_func_extended.txt) | ✔ | ✔ | ✔ | ✔ | | ✔ | |
|
||||
| [GL_EXT_blend_minmax](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_blend_minmax.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_buffer_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_buffer_storage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_clip_control](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_clip_control.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_clip_cull_distance](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_clip_cull_distance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |
|
||||
| [GL_APPLE_clip_distance](https://khronos.org/registry/OpenGL/extensions/APPLE/APPLE_clip_distance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |
|
||||
| [GL_EXT_color_buffer_float](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_color_buffer_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_color_buffer_half_float](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_color_buffer_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_EAC_R11_signed_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_R11_signed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_EAC_R11_unsigned_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_R11_unsigned_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_EAC_RG11_signed_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_RG11_signed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_EAC_RG11_unsigned_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_RG11_unsigned_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_compressed_ETC1_RGB8_sub_texture](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_compressed_ETC1_RGB8_sub_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_ETC1_RGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_punchthroughA_RGBA8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_ETC2_RGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_RGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_ETC2_RGBA8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_RGBA8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_ETC2_sRGB8_alpha8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_sRGB8_alpha8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_ETC2_sRGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_sRGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_compressed_paletted_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_paletted_texture.txt) | | | | | | | |
|
||||
| [GL_EXT_conservative_depth](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_conservative_depth.txt) | | | | | | | |
|
||||
| [GL_EXT_copy_image](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_copy_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_copy_image](https://khronos.org/registry/OpenGL/extensions/OES/OES_copy_image.txt) | | | | | | | |
|
||||
| [GL_KHR_debug](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_debug.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_debug_label](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_debug_label.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_debug_marker](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_debug_marker.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_depth24](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth24.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_depth32](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth32.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_depth_buffer_float2](https://khronos.org/registry/OpenGL/extensions/NV/NV_depth_buffer_float2.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_depth_clamp](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_depth_clamp.txt) | | | | | | | |
|
||||
| [GL_ANGLE_depth_texture](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_depth_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_depth_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_depth_texture_cube_map](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth_texture_cube_map.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_discard_framebuffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_discard_framebuffer.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_disjoint_timer_query](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_disjoint_timer_query.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_draw_buffers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_buffers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_draw_buffers_indexed](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_buffers_indexed.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_draw_buffers_indexed](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_buffers_indexed.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_draw_elements_base_vertex](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_elements_base_vertex.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_draw_elements_base_vertex](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_elements_base_vertex.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_EGL_image](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_EGL_image_array](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_EGL_image_external](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_EGL_image_external_essl3](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external_essl3.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_EGL_image_external_wrap_modes](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_external_wrap_modes.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_EGL_image_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_storage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_EGL_stream_consumer_external](https://khronos.org/registry/OpenGL/extensions/NV/NV_EGL_stream_consumer_external.txt) | | | | | | | |
|
||||
| [GL_OES_EGL_sync](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_sync.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_element_index_uint](https://khronos.org/registry/OpenGL/extensions/OES/OES_element_index_uint.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANDROID_extension_pack_es31a](https://khronos.org/registry/OpenGL/extensions/ANDROID/ANDROID_extension_pack_es31a.txt) | ✔ | | | | | | ✔ |
|
||||
| [GL_EXT_external_buffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_buffer.txt) | | | | | | ✔ | ✔ |
|
||||
| [GL_OES_fbo_render_mipmap](https://khronos.org/registry/OpenGL/extensions/OES/OES_fbo_render_mipmap.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_fence](https://khronos.org/registry/OpenGL/extensions/NV/NV_fence.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_float_blend](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_float_blend.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |
|
||||
| [GL_EXT_frag_depth](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_frag_depth.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_framebuffer_blit](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_framebuffer_blit.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_framebuffer_blit](https://khronos.org/registry/OpenGL/extensions/NV/NV_framebuffer_blit.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_MESA_framebuffer_flip_y](https://khronos.org/registry/OpenGL/extensions/MESA/MESA_framebuffer_flip_y.txt) | | | | | | | |
|
||||
| [GL_EXT_geometry_shader](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_geometry_shader.txt) | ✔ | ✔ | ✔ | ✔ | | | ✔ |
|
||||
| [GL_OES_geometry_shader](https://khronos.org/registry/OpenGL/extensions/OES/OES_geometry_shader.txt) | ✔ | ✔ | ✔ | ✔ | | | ✔ |
|
||||
| [GL_OES_get_program_binary](https://khronos.org/registry/OpenGL/extensions/OES/OES_get_program_binary.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_gpu_shader5](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_gpu_shader5.txt) | ✔ | ✔ | ✔ | ✔ | | ✔ | ✔ |
|
||||
| [GL_ANGLE_instanced_arrays](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_instanced_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_instanced_arrays](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_instanced_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_mapbuffer](https://khronos.org/registry/OpenGL/extensions/OES/OES_mapbuffer.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_map_buffer_range](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_map_buffer_range.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_memory_object](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_memory_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_memory_object_fd](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects_fd.txt) | | | ✔ | ✔ | | ✔ | ✔ |
|
||||
| [GL_EXT_multi_draw_indirect](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multi_draw_indirect.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_multisample_compatibility](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisample_compatibility.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_multisampled_render_to_texture](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture.txt) | | | | | | | |
|
||||
| [GL_EXT_multisampled_render_to_texture2](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture2.txt) | | | | | | | |
|
||||
| [GL_OVR_multiview](https://khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OVR_multiview2](https://khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview2.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_KHR_no_error](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_no_error.txt) | | | | | | | |
|
||||
| [GL_EXT_occlusion_query_boolean](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_occlusion_query_boolean.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_packed_depth_stencil](https://khronos.org/registry/OpenGL/extensions/OES/OES_packed_depth_stencil.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_pack_reverse_row_order](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_pack_reverse_row_order.txt) | | | | | | | |
|
||||
| [GL_NV_pack_subimage](https://khronos.org/registry/OpenGL/extensions/NV/NV_pack_subimage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_KHR_parallel_shader_compile](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_parallel_shader_compile.txt) | | | | | | | |
|
||||
| [GL_AMD_performance_monitor](https://khronos.org/registry/OpenGL/extensions/AMD/AMD_performance_monitor.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_pixel_buffer_object](https://khronos.org/registry/OpenGL/extensions/NV/NV_pixel_buffer_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_polygon_mode](https://khronos.org/registry/OpenGL/extensions/NV/NV_polygon_mode.txt) | | | | | | | |
|
||||
| [GL_EXT_polygon_offset_clamp](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_polygon_offset_clamp.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_primitive_bounding_box](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_primitive_bounding_box.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_primitive_bounding_box](https://khronos.org/registry/OpenGL/extensions/OES/OES_primitive_bounding_box.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_protected_textures](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_protected_textures.txt) | | | | | | ✔ | |
|
||||
| [GL_EXT_pvrtc_sRGB](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_pvrtc_sRGB.txt) | | | | | | | |
|
||||
| [GL_NV_read_depth](https://khronos.org/registry/OpenGL/extensions/NV/NV_read_depth.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_read_depth_stencil](https://khronos.org/registry/OpenGL/extensions/NV/NV_read_depth_stencil.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_read_format_bgra](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_read_format_bgra.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_read_stencil](https://khronos.org/registry/OpenGL/extensions/NV/NV_read_stencil.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_QCOM_render_shared_exponent](https://khronos.org/registry/OpenGL/extensions/QCOM/QCOM_render_shared_exponent.txt) | | | | | | | |
|
||||
| [GL_EXT_render_snorm](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_render_snorm.txt) | | | | | | | |
|
||||
| [GL_OES_rgb8_rgba8](https://khronos.org/registry/OpenGL/extensions/OES/OES_rgb8_rgba8.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_KHR_robust_buffer_access_behavior](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_robust_buffer_access_behavior.txt) | | | | | | | |
|
||||
| [GL_EXT_robustness](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_robustness.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_robustness_video_memory_purge](https://khronos.org/registry/OpenGL/extensions/NV/NV_robustness_video_memory_purge.txt) | | | | | | | |
|
||||
| [GL_OES_sample_shading](https://khronos.org/registry/OpenGL/extensions/OES/OES_sample_shading.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_sample_variables](https://khronos.org/registry/OpenGL/extensions/OES/OES_sample_variables.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_semaphore](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_semaphore.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_semaphore_fd](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects_fd.txt) | | | ✔ | ✔ | | ✔ | ✔ |
|
||||
| [GL_EXT_separate_shader_objects](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_separate_shader_objects.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ARM_shader_framebuffer_fetch](https://khronos.org/registry/OpenGL/extensions/ARM/ARM_shader_framebuffer_fetch.txt) | | | | | ✔ | | ✔ |
|
||||
| [GL_EXT_shader_framebuffer_fetch](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_framebuffer_fetch.txt) | | | | | ✔ | | ✔ |
|
||||
| [GL_EXT_shader_framebuffer_fetch_non_coherent](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_framebuffer_fetch_non_coherent.txt) | | | | | ✔ | | |
|
||||
| [GL_OES_shader_image_atomic](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_image_atomic.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_shader_io_blocks](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_io_blocks.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_shader_io_blocks](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_io_blocks.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_shader_multisample_interpolation](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_multisample_interpolation.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_shader_non_constant_global_initializers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_non_constant_global_initializers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_NV_shader_noperspective_interpolation](https://khronos.org/registry/OpenGL/extensions/NV/NV_shader_noperspective_interpolation.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_shader_texture_lod](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_texture_lod.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_QCOM_shading_rate](https://khronos.org/registry/OpenGL/extensions/QCOM/QCOM_shading_rate.txt) | | | | | | | |
|
||||
| [GL_EXT_shadow_samplers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shadow_samplers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_sRGB](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_sRGB.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_sRGB_write_control](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_sRGB_write_control.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_standard_derivatives](https://khronos.org/registry/OpenGL/extensions/OES/OES_standard_derivatives.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_surfaceless_context](https://khronos.org/registry/OpenGL/extensions/OES/OES_surfaceless_context.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ARB_sync](https://khronos.org/registry/OpenGL/extensions/ARB/ARB_sync.txt) | | | | | | | |
|
||||
| [GL_EXT_tessellation_shader](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_tessellation_shader.txt) | ✔ | ✔ | ✔ | ✔ | | | ✔ |
|
||||
| [GL_OES_texture_3D](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_3D.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_border_clamp](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_border_clamp.txt) | ✔ | ✔ | | | ✔ | | ✔ |
|
||||
| [GL_OES_texture_border_clamp](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_border_clamp.txt) | ✔ | ✔ | | | ✔ | | ✔ |
|
||||
| [GL_EXT_texture_buffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_buffer.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_texture_buffer](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_buffer.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_texture_compression_astc](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_compression_astc.txt) | | | | | | | |
|
||||
| [GL_EXT_texture_compression_astc_decode_mode](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_astc_decode_mode.txt) | | | | | | | |
|
||||
| [GL_EXT_texture_compression_astc_decode_mode_rgb9e5](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_astc_decode_mode_rgb9e5.txt) | | | | | | | |
|
||||
| [GL_KHR_texture_compression_astc_hdr](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_hdr.txt) | | | | | | | |
|
||||
| [GL_KHR_texture_compression_astc_ldr](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_ldr.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_KHR_texture_compression_astc_sliced_3d](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_sliced_3d.txt) | | | | | | | |
|
||||
| [GL_EXT_texture_compression_bptc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_bptc.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | |
|
||||
| [GL_EXT_texture_compression_dxt1](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_dxt1.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | |
|
||||
| [GL_IMG_texture_compression_pvrtc](https://khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt) | | | | | | | |
|
||||
| [GL_IMG_texture_compression_pvrtc2](https://khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc2.txt) | | | | | | | |
|
||||
| [GL_EXT_texture_compression_rgtc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_rgtc.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | |
|
||||
| [GL_EXT_texture_compression_s3tc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_s3tc.txt) | | | | | | | |
|
||||
| [GL_EXT_texture_compression_s3tc_srgb](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_s3tc_srgb.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | |
|
||||
| [GL_EXT_texture_cube_map_array](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_cube_map_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_texture_cube_map_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_cube_map_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_filter_anisotropic](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_filter_anisotropic.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_filter_minmax](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_filter_minmax.txt) | | | | | | | |
|
||||
| [GL_OES_texture_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_texture_float_linear](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_float_linear.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | ✔ |
|
||||
| [GL_EXT_texture_format_BGRA8888](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_format_BGRA8888.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_format_sRGB_override](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_format_sRGB_override.txt) | | ✔ | | | | | |
|
||||
| [GL_OES_texture_half_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_texture_half_float_linear](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_half_float_linear.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_mirror_clamp_to_edge](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_mirror_clamp_to_edge.txt) | | | | | | | |
|
||||
| [GL_EXT_texture_norm16](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_norm16.txt) | | ✔ | | ✔ | | | |
|
||||
| [GL_OES_texture_npot](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_npot.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_rg](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_rg.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_sRGB_decode](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_decode.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_sRGB_R8](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_R8.txt) | ✔ | | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_sRGB_RG8](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_RG8.txt) | | | | | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_texture_stencil8](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_stencil8.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_storage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_texture_storage_multisample_2d_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_storage_multisample_2d_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_EXT_texture_type_2_10_10_10_REV](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_type_2_10_10_10_REV.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_texture_usage](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_texture_usage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_translated_shader_source](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_translated_shader_source.txt) | | | | | | | |
|
||||
| [GL_EXT_unpack_subimage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_unpack_subimage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_vertex_array_object](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_array_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_vertex_half_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_OES_vertex_type_10_10_10_2](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_type_10_10_10_2.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_WEBGL_video_texture](https://khronos.org/registry/OpenGL/extensions/WEBGL/WEBGL_video_texture.txt) | | | | | | | |
|
||||
| [GL_EXT_YUV_target](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_YUV_target.txt) | | | | | | | |
|
||||
|
||||
## ANGLE unofficial extension support
|
||||
|
||||
*Note: some ANGLE extensions are currently missing specifications.*
|
||||
|
||||
| Extension Name | NVIDIA 1660 Win10 | Intel 630 Win10 | NVIDIA 1660 Linux | Intel 630 Linux | SwiftShader Win10 | Pixel 4 Android 11 | Pixel 6 Android 13 |
|
||||
| -------------- | :---------------: | :-------------: | :---------------: | :-------------: | :---------------: | :----------------: | :----------------: |
|
||||
| [GL_ANGLE_base_vertex_base_instance](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_base_vertex_base_instance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_base_vertex_base_instance_shader_builtin](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_base_vertex_base_instance_shader_builtin.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_CHROMIUM_bind_generates_resource](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_bind_generates_resource.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_CHROMIUM_bind_uniform_location](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_bind_uniform_location.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_client_arrays](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_client_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_clip_cull_distance](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_clip_cull_distance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |
|
||||
| [GL_CHROMIUM_color_buffer_float_rgb](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_color_buffer_float_rgb.txt) | | | | | | | |
|
||||
| [GL_CHROMIUM_color_buffer_float_rgba](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_color_buffer_float_rgba.txt) | | | | | | | |
|
||||
| [GL_ANGLE_compressed_texture_etc](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_compressed_texture_etc.txt) | | ✔ | | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_CHROMIUM_copy_compressed_texture](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_copy_compressed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_CHROMIUM_copy_texture](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_copy_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_copy_texture_3d](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_copy_texture_3d.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_CHROMIUM_framebuffer_mixed_samples](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_framebuffer_mixed_samples.txt) | | | | | | | |
|
||||
| [GL_ANGLE_framebuffer_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_framebuffer_multisample.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_get_image](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_get_serialized_context_string](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_serialized_context_string.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_get_tex_level_parameter](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_tex_level_parameter.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_logic_op](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_logic_op.txt) | ✔ | ✔ | ✔ | ✔ | | | |
|
||||
| [GL_CHROMIUM_lose_context](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_lose_context.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_lossy_etc_decode](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_lossy_etc_decode.txt) | | | | | | | |
|
||||
| [GL_ANGLE_memory_object_flags](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_object_flags.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_memory_object_fuchsia](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_object_fuchsia.txt) | | | | | | | |
|
||||
| [GL_ANGLE_memory_size](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_size.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_multi_draw](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_multi_draw.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_multiview_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_multiview_multisample.txt) | | | | | | | |
|
||||
| [GL_ANGLE_polygon_mode](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_polygon_mode.txt) | | | | | | | |
|
||||
| [GL_ANGLE_program_binary](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_program_binary.txt) | | | | | | | |
|
||||
| [GL_ANGLE_program_cache_control](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_program_cache_control.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_provoking_vertex](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_provoking_vertex.txt) | | | | | | | |
|
||||
| [GL_ANGLE_read_only_depth_stencil_feedback_loops](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_read_only_depth_stencil_feedback_loops.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_relaxed_vertex_attribute_type](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_relaxed_vertex_attribute_type.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_renderability_validation](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_renderability_validation.txt) | | | | | | | |
|
||||
| [GL_ANGLE_request_extension](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_request_extension.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_rgbx_internal_format](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_rgbx_internal_format.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_robust_client_memory](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_client_memory.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_robust_fragment_shader_output](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_fragment_shader_output.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_robust_resource_initialization](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_resource_initialization.txt) | | | | | | | |
|
||||
| [GL_ANGLE_semaphore_fuchsia](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_semaphore_fuchsia.txt) | | | | | | | |
|
||||
| [GL_ANGLE_shader_binary](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_shader_binary.txt) | | | | | | | |
|
||||
| [GL_ANGLE_shader_pixel_local_storage](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_shader_pixel_local_storage.txt) | | | | | | | |
|
||||
| [GL_ANGLE_shader_pixel_local_storage_coherent](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_shader_pixel_local_storage.txt) | | | | | | | |
|
||||
| [GL_ANGLE_stencil_texturing](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_stencil_texturing.txt) | | | | | | | |
|
||||
| [GL_CHROMIUM_sync_query](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_sync_query.txt) | | | | | | | |
|
||||
| [GL_ANGLE_texture_compression_dxt3](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_compression_dxt3.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | |
|
||||
| [GL_ANGLE_texture_compression_dxt5](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_compression_dxt5.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | |
|
||||
| [GL_ANGLE_texture_external_update](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_external_update.txt) | | | | | | | |
|
||||
| [GL_CHROMIUM_texture_filtering_hint](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_texture_filtering_hint.txt) | | | | | ✔ | | |
|
||||
| [GL_ANGLE_texture_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_multisample.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_texture_rectangle](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_rectangle.txt) | | | | | | | |
|
||||
| [GL_ANGLE_vulkan_image](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_vulkan_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
| [GL_ANGLE_webgl_compatibility](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_webgl_compatibility.txt) | | | | | | | |
|
||||
| [GL_ANGLE_yuv_internal_format](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_yuv_internal_format.txt) | ✔ | | ✔ | ✔ | ✔ | ✔ | ✔ |
|
||||
|
||||
## GLES 1.0 and 1.1 extension support
|
||||
|
||||
| Extension Name | SwiftShader Win10 |
|
||||
| -------------- | :---------------: |
|
||||
| [GL_OES_draw_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_texture.txt) | ✔ |
|
||||
| [GL_OES_framebuffer_object](https://khronos.org/registry/OpenGL/extensions/OES/OES_framebuffer_object.txt) | ✔ |
|
||||
| [GL_OES_matrix_palette](https://khronos.org/registry/OpenGL/extensions/OES/OES_matrix_palette.txt) | |
|
||||
| [GL_OES_point_size_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_point_size_array.txt) | ✔ |
|
||||
| [GL_OES_point_sprite](https://khronos.org/registry/OpenGL/extensions/OES/OES_point_sprite.txt) | ✔ |
|
||||
| [GL_OES_query_matrix](https://khronos.org/registry/OpenGL/extensions/OES/OES_query_matrix.txt) | |
|
||||
| [GL_OES_texture_cube_map](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_cube_map.txt) | ✔ |
|
||||
|
||||
## EGL extension support
|
||||
|
||||
Currently EGL extensions are not automatically tracked by our scripting. For a
|
||||
list of supported EGL extensions in ANGLE's front-end see
|
||||
[`src/libANGLE/Caps.h`](../src/libANGLE/Caps.h).
|
||||
|
||||
## Configuration information
|
||||
|
||||
NVIDIA 1660 Win10:
|
||||
|
||||
* `GL_RENDERER` is `ANGLE (NVIDIA, Vulkan 1.2.142 (NVIDIA GeForce GTX 1660 (0x00002184)), NVIDIA-456.38.0.0)`
|
||||
* `GL_VENDOR` is `Google Inc. (NVIDIA)`
|
||||
* `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.20572 git hash: 75901296a09f)`
|
||||
* Data updated February 22, 2023
|
||||
|
||||
Intel 630 Win10:
|
||||
|
||||
* `GL_RENDERER` is `ANGLE (Intel, Vulkan 1.3.215 (Intel(R) UHD Graphics 630 (0x00009BC5)), Intel Corporation-101.101.)`
|
||||
* `GL_VENDOR` is `Google Inc. (Intel)`
|
||||
* `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.20572 git hash: 75901296a09f)`
|
||||
* Data updated February 22, 2023
|
||||
|
||||
NVIDIA 1660 Linux:
|
||||
|
||||
* `GL_RENDERER` is `ANGLE (NVIDIA, Vulkan 1.1.119 (NVIDIA GeForce GTX 1660 (0x00002184)), NVIDIA-440.100.0.0)`
|
||||
* `GL_VENDOR` is `Google Inc. (NVIDIA)`
|
||||
* `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.20572 git hash: 75901296a09f)`
|
||||
* Data updated February 22, 2023
|
||||
|
||||
Intel 630 Linux:
|
||||
|
||||
* `GL_RENDERER` is `ANGLE (Intel, Vulkan 1.2.131 (Intel(R) UHD Graphics 630 (CML GT2) (0x00009BC5)), Intel open-source Mesa driver-20.0.8)`
|
||||
* `GL_VENDOR` is `Google Inc. (Intel)`
|
||||
* `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.20572 git hash: 75901296a09f)`
|
||||
* Data updated February 22, 2023
|
||||
|
||||
SwiftShader Win10:
|
||||
|
||||
* `GL_RENDERER` is `ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver-5.0.0)`
|
||||
* `GL_VENDOR` is `Google Inc. (Google)`
|
||||
* `GL_VERSION` is `OpenGL ES 3.1.0 (ANGLE 2.1.20572 git hash: 75901296a09f)`
|
||||
* Data updated February 22, 2023
|
||||
|
||||
Pixel 4 Android 11:
|
||||
|
||||
* `GL_RENDERER` is `ANGLE (Qualcomm, Vulkan 1.1.128 (Adreno (TM) 640 (0x06040001)), Qualcomm Technologies Inc. Adreno Vulkan Driver-512.490.0)`
|
||||
* `GL_VENDOR` is `Google Inc. (Qualcomm)`
|
||||
* `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.20572 git hash: 75901296a09f)`
|
||||
* Data updated February 22, 2023
|
||||
|
||||
Pixel 6 Android 13:
|
||||
|
||||
* `GL_RENDERER` is `ANGLE (ARM, Vulkan 1.1.201 (Mali-G78 (0x92020010)), Mali-G78-36.0.0)`
|
||||
* `GL_VENDOR` is `Google Inc. (ARM)`
|
||||
* `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.20572 git hash: 75901296a09f)`
|
||||
* Data updated February 22, 2023
|
||||
|
||||
## How to update supported extension data
|
||||
|
||||
Supported extension data is stored in the ANGLE repo as JSON files in
|
||||
[`scripts/extension_data`](../scripts/extension_data). The JSON data is
|
||||
sourced from public ANGLE test runs. Look for `angle_end2end_tests` in a bot
|
||||
run: [example link](https://ci.chromium.org/ui/p/angle/builders/ci/win-test/520/overview).
|
||||
Search for "`angle_end2end_tests`", then click on the "cas output" and find
|
||||
`GLinfo_ES3_2_Vulkan.json` or `GLinfo_ES3_1_Vulkan_SwiftShader.json` for
|
||||
SwiftShader.
|
||||
|
||||
All data except for GLES 1 is automatically updated using
|
||||
the [`update_extension_data.py`](../scripts/update_extension_data.py) script.
|
||||
To use it first authenticate to the `bb` and `luci-go` tools by running `bb
|
||||
auth-login` and `./tools/luci-go/swarming login`. Then run the script and
|
||||
re-run [code generation][CodeGen].
|
||||
|
||||
The GLES 1 data is currently manually updated. Find the relevant
|
||||
file from the task output (see above) and overwrite the correspoding file.
|
||||
Re-run [code generation][CodeGen] and create a CL as per our normal process.
|
||||
|
||||
To add a new configuration, first retrieve the JSON data, modify
|
||||
[`gen_extensions.py`](../src/libANGLE/gen_extensions.py) as necessary, then
|
||||
run [`scripts/run_code_generation.py`][CodeGen] to refresh generated files.
|
||||
Also update `update_extension_data.py` as necessary.
|
||||
|
||||
[CodeGen]: ../scripts/run_code_generation.py
|
||||
@@ -1,124 +0,0 @@
|
||||
# Using External Benchmarks with ANGLE
|
||||
|
||||
This document contains instructions on how to run external benchmarks on ANGLE as the GLES renderer.
|
||||
There is a section for each benchmark with subsections for each platform. The general theme is to
|
||||
make the benchmark application pick ANGLE's `libGLESv2.so` and `libEGL.so` files instead of the
|
||||
system ones.
|
||||
|
||||
On Linux, this is generally achieved with setting `LD_LIBRARY_PATH`. On Windows, ANGLE dlls may
|
||||
need to be copied to the benchmark's executable directory.
|
||||
|
||||
## glmark2
|
||||
|
||||
This benchmark can be found on [github](https://github.com/glmark2/glmark2). It's written against
|
||||
GLES 2.0 and supports Linux and Android. It performs tens of tests and reports the framerate for
|
||||
each test.
|
||||
|
||||
### glmark2 on Linux
|
||||
|
||||
To build glmark2 on Linux:
|
||||
|
||||
```
|
||||
$ git clone https://github.com/glmark2/glmark2.git
|
||||
$ cd glmark2
|
||||
$ ./waf configure --with-flavors=x11-glesv2 --data-path=$PWD/data/
|
||||
$ ./waf
|
||||
```
|
||||
|
||||
To run glmark2 using the native implementation of GLES:
|
||||
|
||||
```
|
||||
$ cd build/src
|
||||
$ ./glmark2-es2
|
||||
```
|
||||
|
||||
To run glmark2 using ANGLE, we need to first create a few links in the build directory of ANGLE:
|
||||
|
||||
```
|
||||
$ cd /path/to/angle/out/release
|
||||
$ ln -s libEGL.so libEGL.so.1
|
||||
$ ln -s libGLESv2.so libGLESv2.so.2
|
||||
```
|
||||
|
||||
Back in glmark2, we need to make sure these shared objects are picked up:
|
||||
|
||||
```
|
||||
$ cd /path/to/glmark2/build/src
|
||||
$ LD_LIBRARY_PATH=/path/to/angle/out/release/ ldd ./glmark2-es2
|
||||
```
|
||||
|
||||
With `ldd`, you can verify that `libEGL.so.1` and `libGLESv2.so.2` are correctly picked up from
|
||||
ANGLE's build directory.
|
||||
|
||||
To run glmark2 on the default back-end of ANGLE:
|
||||
|
||||
```
|
||||
$ LD_LIBRARY_PATH=/path/to/angle/out/release/ ./glmark2-es2
|
||||
```
|
||||
|
||||
To run glmark2 on a specific back-end of ANGLE:
|
||||
|
||||
```
|
||||
$ ANGLE_DEFAULT_PLATFORM=vulkan LD_LIBRARY_PATH=/path/to/angle/out/release/ ./glmark2-es2
|
||||
```
|
||||
|
||||
### glmark2 on Linux for Android
|
||||
|
||||
**Prerequisites**
|
||||
|
||||
Below steps are set up to use version 26.0.1 of build-tools, which can be downloaded here:
|
||||
|
||||
[https://dl.google.com/android/repository/build-tools_r26.0.1-linux.zip](https://dl.google.com/android/repository/build-tools_r26.0.1-linux.zip)
|
||||
|
||||
Tested with r19 of NDK, which can be downloaded here:
|
||||
|
||||
[https://dl.google.com/android/repository/android-ndk-r19-linux-x86_64.zip](https://dl.google.com/android/repository/android-ndk-r19-linux-x86_64.zip)
|
||||
|
||||
Tested with OpenJDK 8:
|
||||
|
||||
```
|
||||
sudo apt-get install openjdk-8-jdk
|
||||
```
|
||||
|
||||
Note: This is built from a branch that has fixes for Android. It only supports
|
||||
32-bit ARM (armeabi-v7a). Supporting other ABIs requires more work, possibly
|
||||
including a move to cmake instead of ndk-build.
|
||||
|
||||
**Setup**
|
||||
|
||||
```
|
||||
export ANDROID_SDK=<path_to_Android_SDK>
|
||||
export ANDROID_NDK=<path_to_Android_NDK>
|
||||
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
|
||||
```
|
||||
|
||||
**Build**
|
||||
|
||||
```
|
||||
git clone https://github.com/cnorthrop/glmark2.git
|
||||
cd glmark2/android
|
||||
git checkout android_fixes
|
||||
./build.sh
|
||||
```
|
||||
|
||||
**Install**
|
||||
|
||||
```
|
||||
adb install --abi armeabi-v7a glmark2.apk
|
||||
```
|
||||
|
||||
**Run**
|
||||
|
||||
To select ANGLE as the driver on Android (requires Android Q):
|
||||
|
||||
```
|
||||
adb shell settings put global angle_gl_driver_selection_pkgs org.linaro.glmark2
|
||||
adb shell settings put global angle_gl_driver_selection_values angle
|
||||
```
|
||||
|
||||
To switch back to native GLES driver:
|
||||
|
||||
```
|
||||
adb shell settings delete global angle_gl_driver_selection_values
|
||||
adb shell settings delete global angle_gl_driver_selection_pkgs
|
||||
```
|
||||
@@ -1,82 +0,0 @@
|
||||
# GPU Memory Reporting and Analysis
|
||||
|
||||
[MemRptExt]: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_EXT_device_memory_report.html
|
||||
[enabling-general-logging]: DebuggingTips.md#enabling-general-logging
|
||||
|
||||
GPU memory usage data can be reported when using the Vulkan back-end with drivers that support the
|
||||
[VK_EXT_device_memory_report][MemRptExt] extension. When enabled, ANGLE will produce log messages
|
||||
based on every allocation, free, import, unimport, and failed allocation of GPU memory. This
|
||||
functionality requires [enabling general logging](#enabling-general-logging) as well as enabling
|
||||
one or two feature flags.
|
||||
|
||||
## GPU Memory Reporting
|
||||
|
||||
ANGLE registers a callback function with the Vulkan driver for the
|
||||
[VK_EXT_device_memory_report][MemRptExt] extension. The Vulkan driver calls this callback for
|
||||
each of the following GPU memory events:
|
||||
|
||||
- Allocation of GPU memory by ANGLE
|
||||
- Free of GPU memory by ANGLE
|
||||
- Import of GPU memory provided by another process (e.g. Android SurfaceFlinger)
|
||||
- Unimport of GPU memory provided by another process
|
||||
- Failed allocation
|
||||
|
||||
The callback provides additional information about each event such as the size, the VkObjectType,
|
||||
and the address (see the extension documentation for more details). ANGLE caches this information,
|
||||
and logs messages based on this information. ANGLE keeps track of how much of each type of memory
|
||||
is allocated and imported. For example, if a GLES command causes ANGLE five 4 KB descriptor set
|
||||
(VK_OBJECT_TYPE_DESCRIPTOR_SET) allocations, ANGLE will add 20 KB to the total of allocated
|
||||
descriptor set memory.
|
||||
|
||||
ANGLE supports two types of memory reporting, both of which are enabled
|
||||
via feature flags:
|
||||
|
||||
* `logMemoryReportStats` provides summary statistics at each eglSwapBuffers() command
|
||||
* `logMemoryReportCallbacks` provides per-callback information at the time of the callback
|
||||
|
||||
Both feature flags can be enabled at the same time. A simple way to enable either or both of these
|
||||
feature flags on Android is with with the following command:
|
||||
```
|
||||
adb shell setprop debug.angle.feature_overrides_enabled <feature>[:<feature>]
|
||||
```
|
||||
where `<feature>` is either `logMemoryReportStats` or `logMemoryReportCallbacks`. Both can be
|
||||
enabled by putting a colon between them, such as the following:
|
||||
```
|
||||
adb shell setprop debug.angle.feature_overrides_enabled logMemoryReportCallbacks:logMemoryReportStats
|
||||
```
|
||||
|
||||
Another way to enable either or both of these feature flags is by editing the `RendererVk.cpp` file,
|
||||
and changing `false` in the following lines to `true`:
|
||||
```
|
||||
ANGLE_FEATURE_CONDITION(&mFeatures, logMemoryReportCallbacks, false);
|
||||
ANGLE_FEATURE_CONDITION(&mFeatures, logMemoryReportStats, false);
|
||||
```
|
||||
|
||||
Note: At this time, GPU memory reporting has only been tested and used on Android, where the logged
|
||||
information can be viewed with the `adb logcat` command.
|
||||
|
||||
## GPU Memory Analysis
|
||||
|
||||
GPU memory reporting can be combined with other forms of debugging in order to do analysis. For
|
||||
example, for a GLES application/test that properly shuts down, the total size of each type of
|
||||
allocated and imported memory should be zero bytes at the end of the application/test. If not, a
|
||||
memory leak exists, and the log can be used to determine where the leak occurs.
|
||||
|
||||
If an application seems to be using too much GPU memory, enabling memory reporting can reveal which
|
||||
type of memory is being excessively used.
|
||||
|
||||
Complex forms of analysis can be done by enabling logging of every GLES and EGL API command. This
|
||||
can be enabled at compilation time by [enabling general logging](#enabling-general-logging) as well
|
||||
as setting the following GN arg:
|
||||
```
|
||||
angle_enable_trace_android_logcat = true
|
||||
```
|
||||
|
||||
Combining that with enabling the `logMemoryReportCallbacks` feature flag will allow each memory
|
||||
allocation and import to be correlated with the GLES/EGL commands that caused it. If more context
|
||||
is needed for the type of drawing and/or setup that is being done in a sea of GLES commands, this
|
||||
can also be combined with the use of a graphics debugger such as Android GPU Inspector (AGI) or
|
||||
RenderDoc. The debugger can help you understand what the application is doing at the time of the
|
||||
particular GPU memory event is occuring. For example, you might determine that the application is
|
||||
doing something to cause a memory leak; or you may get insight into what the game is doing that
|
||||
contributes to ANGLE using excessive amounts of GPU memory.
|
||||
@@ -1,9 +0,0 @@
|
||||
# M(ulti-platform)ANGLE effort
|
||||
|
||||
Starting in early 2014, the ANGLE team has begun work on refactoring the code
|
||||
with the goal of supporting translation to desktop OpenGL. In 2016, work on
|
||||
supporting Vulkan as a back-end started. The new purpose of ANGLE is to
|
||||
provide a consistent OpenGL ES and EGL context on as many platforms as possible.
|
||||
|
||||
The design doc is available [here]
|
||||
(https://docs.google.com/document/d/17mxRfzXuEWyvGM3t2KqVY4svvfRj_GzysOEpmnDpqeo/edit?usp=sharing).
|
||||
@@ -1,33 +0,0 @@
|
||||
# Metal Backend Shaders
|
||||
|
||||
ANGLE's Metal backend provides a couple of features for inspecting the
|
||||
Metal Shading Language (MSL) produced by ANGLE's shader translator.
|
||||
|
||||
## printMetalShaders
|
||||
|
||||
The [`printMetalShaders`
|
||||
feature](https://chromium-review.googlesource.com/c/angle/angle/+/4480976),
|
||||
which can be enabled in Chromium via the command line argument
|
||||
`--enable-angle-features=printMetalShaders`, dumps the blob cache key
|
||||
and translated MSL for all shaders compiled by ANGLE. This is
|
||||
currently used to [regenerate precompiled
|
||||
shaders](https://crbug.com/1423136) shipped with Chrome.
|
||||
|
||||
## Environment variable
|
||||
|
||||
Setting the environment variable `ANGLE_METAL_PRINT_MSL_ENABLE` to `1`
|
||||
indicates to the Metal backend to print the translated shaders as
|
||||
they're compiled:
|
||||
|
||||
```
|
||||
export ANGLE_METAL_PRINT_MSL_ENABLE=1
|
||||
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --use-angle=metal
|
||||
```
|
||||
|
||||
To pass this environment to WebKit / Safari's GPU process, set the
|
||||
environment variable `__XPC_ANGLE_METAL_PRINT_MSL_ENABLE` to `1`:
|
||||
|
||||
```
|
||||
export __XPC_ANGLE_METAL_PRINT_MSL_ENABLE=1
|
||||
/Applications/Safari\ Technology\ Preview.app/Contents/MacOS/Safari\ Technology\ Preview
|
||||
```
|
||||
@@ -1,143 +0,0 @@
|
||||
# ANGLE Orientation
|
||||
|
||||
A basic guide to get up and running fixing bugs and performance issues in ANGLE.
|
||||
|
||||
## First ANGLE Compile
|
||||
|
||||
### Windows
|
||||
|
||||
- Download and install
|
||||
[Visual Studio Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx).
|
||||
Installing takes some time.
|
||||
|
||||
- Take the time to register a Microsoft account, otherwise you'll get nagged to death.
|
||||
|
||||
- Download and install Chromium's
|
||||
[depot_tools](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up)
|
||||
for building ANGLE.
|
||||
|
||||
- Add the `depot_tools` dir to your system path. Open start menu, type "edit environment variables",
|
||||
add it to PATH.
|
||||
|
||||
- (recommended) Download and install [Git for Windows](http://gitforwindows.org/).
|
||||
|
||||
- Open Git bash, head to C:/src and follow the steps on
|
||||
[the ANGLE wiki](https://chromium.googlesource.com/angle/angle/+/main/doc/DevSetup.md#Development-setup-Getting-the-source)
|
||||
to set up the ANGLE solution for the first time.
|
||||
|
||||
- If you follow the [ANGLE wiki VS solution building and debugging guide](https://chromium.googlesource.com/angle/angle/+/main/doc/DevSetup.md#building-and-debugging-with-visual-studio), the VS solution will be in `c:/src/angle/out/Debug/angle-debug.sln`. Open and let the installation
|
||||
finish. **Important**: set indent style to spaces, not tabs!
|
||||
|
||||
- Building should work at this point!
|
||||
|
||||
- Try running `angle_end2end_tests`, `angle_unittests` or a sample program.
|
||||
|
||||
- Useful VS extensions:
|
||||
|
||||
1. [Build Only Startup Project](https://marketplace.visualstudio.com/items?itemName=SenHarada.BuildOnlyStartupProject)
|
||||
2. [SwitchStartupProject](https://marketplace.visualstudio.com/items?itemName=vs-publisher-141975.SwitchStartupProject)
|
||||
3. [Smart CommandLine Arguments](https://www.visualstudiogallery.msdn.microsoft.com/535f79b1-fbe0-4b0a-a346-8cdf271ea071)
|
||||
|
||||
### Linux
|
||||
|
||||
- Download and install Chromium's
|
||||
[depot_tools](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up)
|
||||
for building ANGLE.
|
||||
|
||||
- Ensure you add `depot_tools` to your bashrc as in the wiki link above.
|
||||
|
||||
- Follow the steps on
|
||||
[the ANGLE wiki](https://chromium.googlesource.com/angle/angle/+/main/doc/DevSetup.md#Development-setup-Getting-the-source)
|
||||
to setup ANGLE's build.
|
||||
|
||||
- Building should work at this point! Follow the steps on the Wiki.
|
||||
|
||||
- Try running `angle_end2end_tests`, `angle_unittests` or a sample program.
|
||||
|
||||
## Setting up the [drawElements testing suite](http://go/dEQP)
|
||||
|
||||
- [Cherry](https://sites.google.com/a/google.com/deqp/cherry) is the UI for viewing test results.
|
||||
ANGLE checks out a copy in `<angledir>/third_party/cherry`.
|
||||
|
||||
- Follow the instructions in the
|
||||
[installation README](https://android.googlesource.com/platform/external/cherry/+/refs/heads/main/README)
|
||||
to get it running. On Windows, use 64-bit.
|
||||
|
||||
- Read up on testing with
|
||||
[dEQP on the ANGLE Wiki](https://chromium.googlesource.com/angle/angle/+/main/doc/dEQP.md).
|
||||
|
||||
- Try running `angle_deqp_gles2_tests_no_gtest` with the flag
|
||||
`--deqp-case=dEQP-GLES2.functional.negative_api.*` and load a test report in Cherry.
|
||||
|
||||
- To use Cherry, browse to [http://localhost:8080/#/results](http://localhost:8080/#/results) and
|
||||
click '**Import existing batch**', loading `TestResults.qpa`. Look for the qpa file in the
|
||||
current working directory, or `<angledir>/src/tests` if you ran the tests from Visual Studio.
|
||||
|
||||
- Note: we only use Cherry for viewing test output, not running the tests. On start, you may see
|
||||
some runtime messages about unable to load case lists. These are safe to ignore. If you didn't
|
||||
load the results URL directly, click the "**Results**" tab to find the Import button.
|
||||
|
||||
## Profiling
|
||||
|
||||
### With Visual Studio
|
||||
|
||||
- In Visual Studio 2017, look under Debug/Profiler/Performance Explorer/New Performance Session.
|
||||
Right-click "Targets" and add `angle_perftests` as a Target Project.
|
||||
|
||||
- Run `angle_perftests` with the flag `--gtest_filter=DrawCallPerfBenchmark.Run/d3d11_null` for
|
||||
D3D11, `.../d3d9_null` for D3D9, `.../gl_null` for OpenGL and `.../vulkan_null` for Vulkan.
|
||||
|
||||
- Make sure you close all open instances of Chrome, they use a lot of background CPU and GPU. In
|
||||
fact, close every process and application you can.
|
||||
|
||||
### Profiling with Visual Studio + Chrome
|
||||
|
||||
- Install [Chrome Canary](https://www.google.com/chrome/browser/canary.html).
|
||||
|
||||
- Canary's install dir is usually `%APPDATA%/Local/Google/Chrome SxS/Application`
|
||||
|
||||
- Build ANGLE x64, Release, and run 'python scripts/update_chrome_angle.py' to replace Canary's
|
||||
ANGLE with your custom ANGLE. (Note: Canary must be closed)
|
||||
|
||||
- Start Canary with `--gpu-startup-dialog --disable-gpu-sandbox`, wait for the dialog.
|
||||
|
||||
- In Visual Studio, under Debug/Profiler, choose attach to process.
|
||||
|
||||
- Attach to the Chrome GPU process, then immediately pause profiling.
|
||||
|
||||
- **IMPORTANT:** Verify ANGLE details are correct in `about:gpu`.
|
||||
|
||||
- In Canary, start your benchmark, then resume profiling, and exit when done. The report will load
|
||||
automatically.
|
||||
|
||||
## Bookmark the latest Khronos specs
|
||||
|
||||
- [The GLES 2.0 Spec](https://www.khronos.org/registry/OpenGL/specs/es/2.0/es_full_spec_2.0.pdf)
|
||||
|
||||
- [The GLES 3.0 Spec](https://www.khronos.org/registry/OpenGL/specs/es/3.0/es_spec_3.0.pdf)
|
||||
|
||||
- [The GLES 3.1 Spec](https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf)
|
||||
|
||||
- [The GLES Shading Language 1.00 Spec](https://www.khronos.org/files/opengles_shading_language.pdf)
|
||||
|
||||
- [The GLES Shading Language 3.00 Spec](https://www.khronos.org/registry/gles/specs/3.0/GLSL_ES_Specification_3.00.4.pdf)
|
||||
|
||||
- [The WebGL Specs](https://www.khronos.org/registry/webgl/specs/latest/)
|
||||
|
||||
- [A modern desktop OpenGL Spec](https://www.opengl.org/registry/doc/glspec45.core.pdf)
|
||||
(for reference)
|
||||
|
||||
- [The Vulkan Spec](https://www.khronos.org/registry/vulkan/specs/1.0-wsi_extensions/html/vkspec.html)
|
||||
|
||||
These specs can be found in the [OpenGL Registry](https://github.com/KhronosGroup/OpenGL-Registry)
|
||||
and the [Vulkan Docs](https://github.com/KhronosGroup/Vulkan-Docs) repositories as well.
|
||||
|
||||
## Join Groups and Chats
|
||||
|
||||
- Join the `#angle` channel in `chromium.slack.com`.
|
||||
|
||||
### For Googlers
|
||||
|
||||
- Join angle-team@ for access to many important emails and shared documents.
|
||||
|
||||
- We have a Hangouts Chat channel. Ask for an invite.
|
||||
@@ -1,34 +0,0 @@
|
||||
# Resource Limits
|
||||
|
||||
OpenGL ES 2.0 API is quite powerful but there are still some features that are
|
||||
optional or allow for wide variability between implementations.
|
||||
|
||||
Applications that need more than the minimum values for these limits should
|
||||
query the capabilities of the GL device and scale their usage based on the
|
||||
device’s feature set. Failing to do so and assuming sufficient limits typically
|
||||
results in reduced portability.
|
||||
|
||||
The various implementation dependent limits can be found in Tables 6.18 – 6.20
|
||||
of the [OpenGL ES 2.0.25 specification]
|
||||
(http://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.25.pdf).
|
||||
|
||||
# Capabilities
|
||||
|
||||
Capability | ES 2.0 Minimum | ANGLE | SM2 | SM3 | SM4+
|
||||
:----------------------------------------- | :------------- | :--------------- | :---- | :------- | :-------
|
||||
GL\_MAX\_VERTEX\_ATTRIBS | 8 | 16 | | |
|
||||
GL\_MAX\_VERTEX\_UNIFORM\_VECTORS | 128 | 254 | | |
|
||||
GL\_MAX\_VERTEX\_TEXTURE\_IMAGE\_UNITS | 0 | (fn1) | 0 | 0 | 4
|
||||
GL\_MAX\_VARYING\_VECTORS | 8 | (fn1) | 8 | 10 | 10
|
||||
GL\_MAX\_FRAGMENT\_UNIFORM\_VECTORS | 16 | (fn1) | 29 | 221 | 221
|
||||
GL\_MAX\_TEXTURE\_IMAGE\_UNITS | 8 | 16 | | |
|
||||
GL\_MAX\_TEXTURE\_SIZE | 64 | 2048-16384 (fn1) | | |
|
||||
GL\_MAX\_CUBE\_MAP\_SIZE | 16 | 2048-16384 (fn1) | | |
|
||||
GL\_MAX\_RENDERBUFFER\_SIZE | 1 | 2048-16384 (fn1) | | |
|
||||
GL\_ALIASED\_POINT\_SIZE\_RANGE (min, max) | (1, 1) | (fn2) | (1,1) | (1, fn2) | (1, fn2)
|
||||
GL\_ALIASED\_LINE\_WIDTH\_RANGE (min, max) | (1, 1) | (1, 1) | | |
|
||||
|
||||
## Notes
|
||||
|
||||
* fn1: limits vary based on the underlying hardware capabilities
|
||||
* fn2: on SM3 or better hardware the max point size is D3DCAPS9.MaxPointSize
|
||||
@@ -1,104 +0,0 @@
|
||||
# Shader substitution
|
||||
|
||||
ANGLE provides two mechanisms for observing, modifying, and substituting
|
||||
the application's shaders. This ability to interpose makes it easier to
|
||||
diagnose bugs and to prototype new transforms in the shader translator.
|
||||
|
||||
## Environment variables controlling reading/writing shaders to disk
|
||||
|
||||
For both the source and translated shaders discussed below, the environment
|
||||
variable:
|
||||
|
||||
```
|
||||
ANGLE_SHADER_DUMP_PATH
|
||||
```
|
||||
|
||||
and the Android property:
|
||||
|
||||
```
|
||||
debug.angle.shader_dump_path
|
||||
```
|
||||
|
||||
specify the directory in which shader sources and translated shaders will
|
||||
be written to, and, in the case of shader substitution, read from. For
|
||||
example, on non-Android platforms:
|
||||
|
||||
```
|
||||
mkdir -p /path/to/angle_shaders
|
||||
export ANGLE_SHADER_DUMP_PATH=/path/to/angle_shaders
|
||||
```
|
||||
|
||||
will write all data to the `angle_shaders` directory.
|
||||
|
||||
On Android, it's necessary to set the `debug.angle.shader_dump_path` property
|
||||
and set up the SD card correctly. (Help expanding this documentation is
|
||||
appreciated!)
|
||||
|
||||
## ESSL shader dumping and substitution
|
||||
|
||||
The ANGLE feature `dumpShaderSource`, when enabled, writes all incoming
|
||||
ESSL shader sources to disk, in the shader dump directory specified
|
||||
above. File names are computed by hashing the shader sources. Shaders will
|
||||
only be written to disk if they were not loaded from disk via substitution,
|
||||
below.
|
||||
|
||||
The ANGLE feature `enableShaderSubstitution`, when enabled, looks for a
|
||||
file in the shader dump directory where the filename is the hash of the
|
||||
application's shader source, and substitutes its contents for the
|
||||
application's shader. This allows you to dump and edit these files at your
|
||||
leisure, and rerun the application to pick up the new versions of the
|
||||
shaders.
|
||||
|
||||
In Chromium, pass the following command line arguments to enable these
|
||||
features:
|
||||
|
||||
```
|
||||
--enable-angle-features=dumpShaderSource
|
||||
--enable-angle-features=enableShaderSubstitution
|
||||
--enable-angle-features=dumpShaderSource,enableShaderSubstitution
|
||||
```
|
||||
|
||||
You must also specify `--disable-gpu-sandbox` to allow ANGLE to access
|
||||
these on-disk files for reading and writing. **Do not** browse the open web
|
||||
with this command line argument specified!
|
||||
|
||||
## Translated shader dumping and substitution
|
||||
|
||||
The translated shaders produced by ANGLE's shader translator can be dumped
|
||||
and substituted as well. This is especially useful when prototyping new
|
||||
optimizations in the shader translator.
|
||||
|
||||
This mechanism is relatively recent and has not been thoroughly tested. It
|
||||
will likely not work in the situation where ANGLE dynamically recompiles
|
||||
shaders internally. It should work with all text-based shader translator
|
||||
backends (ESSL, GLSL, HLSL, and Metal). See comments in
|
||||
`src/libANGLE/Shader.cpp` describing the work needed to make this work with
|
||||
the SPIR-V backend.
|
||||
|
||||
Translated shaders go into the same shader dump directory specified above
|
||||
for shader sources. To enable these features:
|
||||
|
||||
```
|
||||
--enable-angle-features=dumpTranslatedShaders,enableTranslatedShaderSubstitution --disable-gpu-sandbox
|
||||
```
|
||||
|
||||
## Putting it all together (example: macOS)
|
||||
|
||||
```
|
||||
mkdir -p $HOME/tmp/angle_shaders
|
||||
export ANGLE_SHADER_DUMP_PATH=$HOME/tmp/angle_shaders
|
||||
|
||||
out/Release/Chromium.app/Contents/MacOS/Chromium --disable-gpu-sandbox --use-angle=metal --enable-angle-features=dumpShaderSource,enableShaderSubstitution,dumpTranslatedShaders,enableTranslatedShaderSubstitution
|
||||
```
|
||||
|
||||
Run the application once to generate the shader dump. Edit source or
|
||||
translated shaders as desired. Rerun with the same command line arguments
|
||||
to pick up the new versions of the shaders.
|
||||
|
||||
Alternatively, and especially if the application doesn't work with all of
|
||||
the shaders in the substitution directory, make a new directory and copy in
|
||||
only those source or translated shaders you want to substitute, and run:
|
||||
|
||||
```
|
||||
out/Release/Chromium.app/Contents/MacOS/Chromium --disable-gpu-sandbox --use-angle=metal --enable-angle-features=enableShaderSubstitution,enableTranslatedShaderSubstitution
|
||||
```
|
||||
@@ -1,15 +0,0 @@
|
||||
# ANGLE Source Code
|
||||
|
||||
# Browsing
|
||||
|
||||
ANGLE's source no longer resides at code.google.com! To browse the ANGLE source,
|
||||
please visit https://chromium.googlesource.com/angle/angle
|
||||
|
||||
# Checkout
|
||||
|
||||
You may clone the ANGLE repository with:
|
||||
|
||||
> `git clone https://chromium.googlesource.com/angle/angle`
|
||||
|
||||
For full instructions on setting up your system with the necessary prerequisites
|
||||
for development with ANGLE, please see the DevSetup page.
|
||||
@@ -1,121 +0,0 @@
|
||||
# Handling Test Failures
|
||||
|
||||
ANGLE is tested by a number of test suites, including by the ANGLE CI and Try testers, and by the
|
||||
Chromium FYI testers. See pointers and explanations in the
|
||||
[ANGLE Wrangling](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/infra/ANGLEWrangling.md) documentation.
|
||||
|
||||
We run a large number of tests for each ANGLE CL, both in ANGLE standalone and Chromium
|
||||
configurations, both pre- and post- commit. Some tests will fail, crash, or timeout. If these
|
||||
cannot be addressed in a timely manner, file a bug and update test expectations files. Timeliness
|
||||
depends on the context. For example, a Wrangler trying to unblock an AutoRoller will typically
|
||||
suppress failures immediately; where a developer will typically delay landing their CL in favor of
|
||||
fixing test failures.
|
||||
|
||||
## Handling a Vulkan Validation Layer error
|
||||
|
||||
Many tests are run with an option that enables the Vulkan Validation Layers (sometimes referred to
|
||||
as VVL). Validation errors will cause an otherwise-passing test to fail.
|
||||
|
||||
The [vulkan-deps into ANGLE AutoRoller](https://autoroll.skia.org/r/vulkan-deps-angle-autoroll)
|
||||
updates ANGLE to the top-of-tree (ToT) upstream Vulkan tools and SDK. Sometimes validation errors
|
||||
are the result of bugs in the Vulkan Validation Layers, sometimes because of bugs in ANGLE.
|
||||
Therefore, investigate the cause of the error and determine if it's an ANGLE bug or a Vulkan
|
||||
Validation Layer bug. For Vulkan Validation Layer bugs, file an
|
||||
[upstream bug](https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/new), and
|
||||
suppress the error. The ANGLE Wrangler will also suppress a validation error when the
|
||||
`vulkan-deps` AutoRoller introduces a new validation error. The ANGLE Wrangler isn't expected to
|
||||
resolve the error or diagnose an upstream bug (but it is welcome as extra credit).
|
||||
|
||||
Handle a validation error by doing the following:
|
||||
|
||||
1. [File an ANGLE bug](http://anglebug.com/new). If this is an active Wrangler issue, set the Label
|
||||
`Hotlist-Wrangler` on the bug.
|
||||
2. Add the VVL error tag to the
|
||||
[kSkippedMessages](https://chromium.googlesource.com/angle/angle.git/+/8f8ca06dfb903fcc8517c69142c46c05e618f40d/src/libANGLE/renderer/vulkan/RendererVk.cpp#129)
|
||||
array in `RendererVk.cpp` file. Follow the pattern for adding a comment with the associated bug
|
||||
in the line above the VVL tag.
|
||||
|
||||
|
||||
## dEQP test expectations
|
||||
|
||||
There are a set of [dEQP](dEQP.md) expectations files in the
|
||||
[src/tests/deqp_support](../src/tests/deqp_support) directory. Notice the format of a line and
|
||||
your choices for OS, driver, etc. This is described in the directory's
|
||||
[README.md](../src/tests/deqp_support/README.md) file. This includes:
|
||||
- `FLAKY` - For rare flakes
|
||||
- `FAIL` - For a test that flakes often or persistently fails
|
||||
- `SKIP` - For a test that crashes
|
||||
- `TIMEOUT` - For a test that is very slow and may timeout
|
||||
|
||||
|
||||
## angle_end2end_tests expectations
|
||||
|
||||
These expectations all live in the
|
||||
[angle_end2end_tests_expectations.txt](../src/tests/angle_end2end_tests_expectations.txt) file. The file format
|
||||
is the same as for the dEQP expectations. However, `FAIL` and `FLAKY` are not valid, and so the choices are:
|
||||
- `SKIP` - For a test that fails or crashes
|
||||
- `TIMEOUT` - For a test that is very slow and may timeout
|
||||
|
||||
|
||||
## Rubber stamping expectations CLs
|
||||
|
||||
CLs that only change dEQP or angle_end2end_tests expectations don't require a human reviewer and can be
|
||||
[Rubber Stamped](https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/appengine/rubber-stamper/README.md).
|
||||
The procedure is:
|
||||
1. Add rubber-stamper@appspot.gserviceaccount.com as the reviewer on the expectations CL. Please also CC a human reviewer for TBR.
|
||||
2. After 1 minute, Rubber Stamper should set "Bot-Commit: +1" on the CL.
|
||||
3. Now you should be able to "Commit-Queue: +2" your CL.
|
||||
|
||||
|
||||
## WebGL conformance test expectations
|
||||
|
||||
The expectations files are hosted in the `chromium/src` repository under
|
||||
[content/test/gpu/gpu_tests/test_expectations](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/content/test/gpu/gpu_tests/test_expectations/).
|
||||
Note that this is not included in local ANGLE-only source tree.
|
||||
|
||||
The format of the file, including the different tags, is documented at the top of the file. This
|
||||
includes the following results:
|
||||
|
||||
- `RetryOnFailure` - For a test that rarely flakes
|
||||
- `Failure` - For a test that fails consistently or flakes often
|
||||
- `Skip` - For a test that causes catastrophic failures (e.g. ends an entire test run, causes a bot
|
||||
to BSoD); `Skip` should be used very sparingly
|
||||
|
||||
You will need to contact an OWNER of the file to +1 your CL.
|
||||
|
||||
You have two options for creating a CL to the expectations files:
|
||||
|
||||
1. For trivial edits, you can edit the expectations files via
|
||||
[Chromium Code Search](https://source.chromium.org/chromium/chromium/src/+/main:content/test/gpu/gpu_tests/test_expectations/):
|
||||
- In the browser, press the `Edit code` button. This will bring up a new browser window/tab,
|
||||
in an editor mode.
|
||||
- Edit the expecations and then press the `Create change` (or `Update change` button if you
|
||||
need to change your CL later), which will create a CL.
|
||||
2. Otherwise please [check out the code](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/get_the_code.md)
|
||||
and [upload a CL](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/contributing.md#Creating-a-change)
|
||||
|
||||
|
||||
## "internal swarming failure" on one of the test shards
|
||||
|
||||
This might be caused by a bad bot, clicking on link "Bot assigned to task" will show recent tasks which might look bad
|
||||
(for example, lots of BOT_DIED in [crbug.com/1350556](https://crbug.com/1350556)). The best course of action in this case is to
|
||||
stop the bot by clicking the "stop the bot gracefully" button which will result in a task that looks like
|
||||
"Terminate build117-a9", then open a bug in the Infra>Labs component.
|
||||
Googlers, see also: [go/gpu-pixel-wrangler-how-to#manually-taking-a-machine-out-of-the-swarming-pool](http://go/gpu-pixel-wrangler-how-to#manually-taking-a-machine-out-of-the-swarming-pool)
|
||||
|
||||
|
||||
# Requesting access to the Commit Queue and issue tracker
|
||||
|
||||
If you need to request access for a user (or yourself) please ask a project owner to help. Googlers, email
|
||||
angle-team@google.com. External users, find a couple owners in the [OWNERS](../OWNERS) file and send a
|
||||
request via email.
|
||||
|
||||
If you are an ANGLE owner and you want to grant a user access:
|
||||
|
||||
* For the Monorail issue tracker, add users via the ["People" administration console][MonorailPeople].
|
||||
* For the ANGLE Commit Queue (CQ), grant try-job access via the [Chrome Infra Auth administration console][ChromeAdmin].
|
||||
* The admin console also has a separate group for [CQ access][CQAccessAdmin].
|
||||
|
||||
[MonorailPeople]: https://bugs.chromium.org/p/angleproject/people/list
|
||||
[ChromeAdmin]: https://chrome-infra-auth.appspot.com/auth/groups/project-angle-tryjob-access
|
||||
[CQAccessAdmin]: https://chrome-infra-auth.appspot.com/auth/groups/project-angle-committers
|
||||
@@ -1,119 +0,0 @@
|
||||
# ANGLE Development Update - July 4, 2012
|
||||
|
||||
We haven't posted an update on the development status of ANGLE in quite some
|
||||
time and we'd like to provide an update on some of the new features and
|
||||
improvements that we've been working on.
|
||||
|
||||
## Conformance
|
||||
|
||||
As announced in the [Chromium Blog]
|
||||
(http://blog.chromium.org/2011/11/opengl-es-20-certification-for-angle.html),
|
||||
ANGLE v1.0 has passed the Khronos OpenGL ES 2.0 certification process and is now
|
||||
a [conformant](http://www.khronos.org/conformance/adopters/conformant-products/)
|
||||
OpenGL ES 2.0 implementation.
|
||||
|
||||
## Extensions
|
||||
|
||||
We have recently completed the implementation of depth texture support
|
||||
([ANGLE\_depth\_texture]
|
||||
(https://code.google.com/p/angleproject/source/browse/extensions/ANGLE_depth_texture.txt?name=master))
|
||||
and earlier in the year we added support for instancing via attribute array
|
||||
divisors ([ANGLE\_instanced\_arrays]
|
||||
(https://code.google.com/p/angleproject/source/browse/extensions/ANGLE_instanced_arrays.txt?name=master)).
|
||||
See ExtensionSupport for a complete list of extensions that are supported by
|
||||
ANGLE.
|
||||
|
||||
## Shader Compiler
|
||||
|
||||
We have also made a number of improvements in the shader compiler.
|
||||
|
||||
* We addressed a number of defects related to scoping differences between HLSL and
|
||||
GLSL and improved the scoping support in ANGLE's compiler front-end. We also
|
||||
worked with The Khronos Group to get an ESSL spec bug fixed and several items
|
||||
clarified.
|
||||
* We addressed a number of correctness issues in the GLSL to HLSL
|
||||
translation process. We fixed some bugs related to constant propagation and
|
||||
comma conditional assignments. More importantly, we fully implemented support
|
||||
for short-circuiting boolean logic operations. In GLSL, Boolean expressions do
|
||||
short-circuit evaluation as in C, but HLSL evaluates them entirely. This only
|
||||
has an observable effect if a short-circuited operation has side effects, such
|
||||
as a function call that modifies global variables.
|
||||
* We implemented detection
|
||||
for discontinuous gradient or derivative computations inside loops and replace
|
||||
them with explicitly defined continuous behaviour. HLSL and GLSL differ in their
|
||||
specified behaviour for operations which compute gradients or derivatives.
|
||||
Gradients are computed by texture sampling functions which don't specify a
|
||||
specific mipmap LOD level, and by the OES\_standard\_derivatives built-in
|
||||
functions. To determine the gradient, the corresponding values in neighbouring
|
||||
pixels are differentiated. If neighbouring pixels execute different paths
|
||||
through the shader this can cause a discontinuity in the gradient. GLSL
|
||||
specifies that in these cases the gradient is undefined. HLSL tries to avoid the
|
||||
discontinuity in the compiler by unrolling loops so that every pixel executes
|
||||
all iterations. This can make the D3D HLSL compiler spend a long time generating
|
||||
code permutations, and possibly even fail compilation due to running out of
|
||||
instruction slots or registers. Because the GLSL specification allows undefined
|
||||
behaviour, we can define such texture sampling functions to use mipmap LOD level
|
||||
0, and have the derivatives functions return 0.0. To do this we examine the GLSL
|
||||
code's abstract syntax tree and detect whether the shader contains any loops
|
||||
with discontinuities and gradient operations. Within such loops, we generate
|
||||
HLSL code that uses explicitly defined texture LODs and derivative information.
|
||||
One additional consideration is that within these loops there can be calls to
|
||||
user-defined functions which may contain gradient operations. In this case, we
|
||||
generate variants of user-defined functions where these operations are
|
||||
explicitly defined. We use these new functions instead of the original ones in
|
||||
loops with discontinuities.
|
||||
|
||||
These fixes result in ANGLE being able successfully compile a number of the more
|
||||
complex shaders. Unfortunately there are still some complex shaders which we
|
||||
have not yet been able to obtain solutions for. Ultimately Direct3D 9 SM3
|
||||
shaders are more restricted than what can be expressed in GLSL. Most of the
|
||||
problematic shaders we've encountered will also not compile successfully on
|
||||
current ES 2.0 implementations. We would only be able to achieve parity with
|
||||
Desktop GL implementations by using Direct3D 10 or above.
|
||||
|
||||
## Texture Origin Changes
|
||||
|
||||
We have also made a major change to ANGLE in the way the origin difference
|
||||
between D3D and OpenGL is handled. This difference is normally observable when
|
||||
using render-to-texture techniques, and if not accounted for, it would appear
|
||||
that images rendered to textures are upside down. In recent versions of ANGLE
|
||||
(r536 (on Google Code)-r1161 (on Google Code)), we have been storing surfaces
|
||||
following the D3D Y convention where (0, 0) is the top-left, rather than GL's
|
||||
bottom-left convention. This was done by vertically flipping textures on load
|
||||
and then adjusting the texture coordinates in the shaders to compensate. This
|
||||
approach worked well, but it did leave the orientation of pbuffers inverted when
|
||||
compared to native GL implementations. As of ANGLE r1162 (on Google Code), we
|
||||
have changed this back to the original way it was implemented - textures are
|
||||
loaded and stored in the GL orientation, and the final rendered scene is flipped
|
||||
when it is displayed to a window by eglSwapBuffers. This should be essentially
|
||||
transparent to applications except that orientation of pbuffers will change. In
|
||||
addition to fixing the pbuffer orientation, this change:
|
||||
|
||||
* eliminates
|
||||
dependent-texture look-ups in the shaders, caused by flipping the texture
|
||||
y-coordinates
|
||||
* rounding of texture coordinates (while previously within spec)
|
||||
will be more consistent with other implementations, and
|
||||
* allows potential
|
||||
faster paths for loading texture data to be implemented. The only potential
|
||||
downside to this approach is that window-based rendering may be a bit slower for
|
||||
simple scenes. The good news is that this path is not used by browser
|
||||
implementations on most versions of Windows.
|
||||
|
||||
## Preprocessor
|
||||
|
||||
Finally, Alok P. from Google has been working on implementing a new shader
|
||||
preprocessor for the last number of months and this effort is nearly complete.
|
||||
This new preprocessor should be more robust and much more maintainable. It also
|
||||
includes many (~5000) unit tests and passes all WebGL conformance tests. If you
|
||||
wish to try this out before it is enabled by default, define
|
||||
ANGLE\_USE\_NEW\_PREPROCESSOR=1 in your project settings for the
|
||||
translator\_common project.
|
||||
|
||||
## Contributions
|
||||
|
||||
As always we welcome contributions either in the bug reports (preferably with an
|
||||
isolated test-case) or in the form of code contributions. We have added a
|
||||
[ContributingCode](ContributingCode.md) wiki page documenting the preferred
|
||||
process for contributing code. We do need to ask that you sign a Contributor
|
||||
License Agreement before we can integrate your patches.
|
||||
@@ -1,26 +0,0 @@
|
||||
# ANGLE Development Update - June 18, 2013
|
||||
|
||||
This week brings some significant changes to ANGLE, which we think are worth
|
||||
covering in a development update.
|
||||
|
||||
## Migration from svn to git
|
||||
|
||||
We've changed our backing version control system from svn to git. Projects and
|
||||
contributors pulling from the svn repository will continue to be able to do so,
|
||||
but please note that this repository is now read-only, and no further updates
|
||||
will be made there. To continue tracking new development and issue fixes, you'll
|
||||
need to watch the git repository. Instructions on checking out code from the git
|
||||
repository can be found on the [Source Checkout](https://code.google.com/p/angleproject/source/checkout) page.
|
||||
|
||||
## DirectX 11 Support
|
||||
|
||||
ANGLE now provides both a DirectX 9 and a DirectX 11-backed renderer in the same
|
||||
code base. By default, support for the DirectX 11 renderer is disabled, but it
|
||||
can be enabled by toggling the value of ANGLE\_ENABLE\_D3D11 as described on the
|
||||
DevSetup page. On systems without DirectX 11 support, ANGLE will fall back to
|
||||
DirectX 9.
|
||||
|
||||
This work originally appeared in our dx11proto branch, which, with the move to
|
||||
the new repository, has been promoted to master. Code previously located in the
|
||||
trunk of the svn repository will now be located in the git legacy branch, and
|
||||
active development will now move to the newly promoted master.
|
||||
@@ -1,15 +0,0 @@
|
||||
# ANGLE Development Update - November 20, 2013
|
||||
|
||||
ANGLE has undergone a few further migrations in the past week, which we thought
|
||||
it important to mention in a front-page update.
|
||||
|
||||
The review process for contributed code has moved from [Rietveld](https://codereview.appspot.com/)
|
||||
to [Gerrit](https://chromium-review.googlesource.com). This migration allows us to more
|
||||
easily support a Git-centric workflow, and eases the process of accepting
|
||||
changes submitted by contributors without commit access to our repositories.
|
||||
|
||||
As a result of this change, our repository has also moved from its prior
|
||||
location at code.google.com to https://chromium.googlesource.com/angle/angle.
|
||||
The repository may still be pulled from its old location, but no further changes
|
||||
will be committed there. Updates will be made only to the repository's new
|
||||
location.
|
||||
@@ -1,30 +0,0 @@
|
||||
# ES 3.0 Development Branch merging
|
||||
|
||||
ANGLE will soon be merging its ES 3.0 development branch to master, to make
|
||||
available (and more visible) the changes we've been making over the past several
|
||||
months in support of ES 3.0, and to remove divergence between the master and
|
||||
development branches.
|
||||
|
||||
The previous master branch will still be available as the es2only-legacy branch,
|
||||
and SHAs will not change, so dependencies on individual commits of ANGLE will
|
||||
continue to work as expected. However, new contributions against es2only-legacy
|
||||
will generally not be considered, and future work should be done on master.
|
||||
|
||||
This merge doesn't signify completion of ES 3.0, as we have some features still
|
||||
left to implement there, but interested developers can explore the work in
|
||||
progress. A significant portion of 3.0 features have been implemented,
|
||||
including:
|
||||
|
||||
* 2D array textures, 3D textures
|
||||
* Expanded texture format support
|
||||
* Uniform Buffer Objects
|
||||
* Vertex Array Objects
|
||||
* Sampler objects, expanded sampler types
|
||||
* Transform Feedback
|
||||
* Texture Swizzle
|
||||
* GLSL integer support
|
||||
|
||||
ES 3.0 features should not yet be considered stable, even where implemented, and
|
||||
some features are present only via naive implementation so far. There is still
|
||||
quite a bit of work ahead of us before ES 3.0 support is complete, but this
|
||||
merge should provide insight to those interested in what we've been working on!
|
||||
@@ -1,45 +0,0 @@
|
||||
# Multiplatform ANGLE Refactor Complete
|
||||
|
||||
ANGLE's [multiplatform refactoring effort](MANGLE.md) is now complete, paving
|
||||
the way for additional rendering backends, allowing ANGLE to enable OpenGL ES
|
||||
not just over Direct3D 9 and 11, but also desktop OpenGL.
|
||||
|
||||
The refactoring we've done encapsulates D3D-related assumptions and API calls at
|
||||
the renderer level, so that no D3D calls are made in the renderer-agnostic
|
||||
portions of the codebase, and D3D-specific feature implementations won't be
|
||||
included on non-D3D platforms. For example, the creation and maintenance of
|
||||
CPU-side copies of texture data, which are required to enable GL-style
|
||||
per-mip-level texture creation over D3D's entire-mipchain texture creation API,
|
||||
is contained entirely within the D3D renderers, allowing a GL implementation to
|
||||
avoid this complication.
|
||||
|
||||
Work will now begin within ANGLE to add a desktop OpenGL renderer, and EGL
|
||||
implementations compatible with OS X and Linux.
|
||||
|
||||
# ES 3.0 Development Status
|
||||
|
||||
Our ES 3.0 development branch was merged into mainline ANGLE in April 2014, but
|
||||
ES 3.0 support is not yet complete. The majority of API functionality has been
|
||||
implemented; features still pending include:
|
||||
|
||||
* ETC2/EAC support
|
||||
* primitive restart index
|
||||
* drawRangeElements
|
||||
* full GetProgramBinary support in core
|
||||
|
||||
Additional work remains in the compiler, including:
|
||||
|
||||
* Array .length()
|
||||
* inf/nan detection
|
||||
* math utility functions, rounding
|
||||
* VertexID/InstanceID support
|
||||
* floating point packing functions
|
||||
* operators new in ES 3.0
|
||||
* name redeclaration
|
||||
* relaxed array indexing
|
||||
* switch statement support
|
||||
* loop & iteration improvements
|
||||
|
||||
ES 3.0 features should not be considered stable, even where implemented, and
|
||||
some features are present only via naive implementation so far, but we welcome
|
||||
bugs filed against this functionality, and thank all our contributors!
|
||||
76
doc/VTF.md
76
doc/VTF.md
@@ -1,76 +0,0 @@
|
||||
# Vertex Texture Fetch
|
||||
|
||||
This page details the steps necessary to implement vertex texture fetch in ANGLE
|
||||
and documents some of the pitfalls that may be encountered along the way.
|
||||
|
||||
# Details
|
||||
|
||||
Tasks to implement vertex texture support.
|
||||
|
||||
1. add/enable vertex shader texture look up functions in compiler & HLSL
|
||||
translator.
|
||||
* add texture2DLod, texture2DProjLod (2 variants), textureCubeLod (these
|
||||
are **only** valid in vertex shaders)
|
||||
* ensure other (non-bias/non-LOD) texture functions work in vertex shaders
|
||||
* non-mipmapped textures use the only level available
|
||||
* mipmapped textures use only the base level (ie level 0).
|
||||
2. update implementation-dependent constants in Context.h
|
||||
* MAX\_VERTEX\_TEXTURE\_IMAGE\_UNITS = 4
|
||||
* MAX\_COMBINED\_TEXTURE\_IMAGE\_UNITS =
|
||||
MAX\_VERTEX\_TEXTURE\_IMAGE\_UNITS + MAX\_TEXTURE\_IMAGE\_UNITS (ie 20).
|
||||
* these limits have to change based on the d3d device characteristics. For
|
||||
example we likely don't want to advertise vertex image units on SM2.0
|
||||
cards (unless we end up using software vertex processing).
|
||||
* detection of hardware support for various formats, types, etc.
|
||||
* As a first pass, use the "hasVertexTextures" check that Aras suggested
|
||||
to only enable VTF on DX10 NVIDIA and AMD parts, and SM3 Intel parts.
|
||||
* If this proves insufficient, there are other things we can do, but it
|
||||
involves using software vertex processing for unsupported formats and
|
||||
system memory copies of textures -- all stuff which is rather annoying
|
||||
and likely to hurt performance (see point 4. below).
|
||||
3. add support and handling for vertex textures/samplers in the API.
|
||||
* any textures used in a vertex shader need to get assigned to the special
|
||||
samplers in d3d9
|
||||
* there are only 4 of them (D3DVERTEXTEXTURESAMPLER0..
|
||||
D3DVERTEXTEXTURESAMPLER3)
|
||||
* if a texture is used in both vertex & fragment it counts twice against
|
||||
the "MAX\_COMBINED" limit (validated in Program::validateSamplers)
|
||||
* there are a number of places in our code where we have arrays of size,
|
||||
or iterate over, MAX\_TEXTURE\_IMAGE\_UNITS. These will need to be
|
||||
changed to operate on MAX\_COMBINED\_TEXTURE\_IMAGE\_UNITS instead. A
|
||||
(possibly incomplete & outdated) list of areas that need to be updated
|
||||
is as follows:
|
||||
* Program.h - increase size of mSamplers
|
||||
* Context.h - increase size of samplerTexture
|
||||
* glActiveTexture needs accept values in the range
|
||||
0..MAX\_COMBINED\_TEXTURE\_IMAGE\_UNITS-1
|
||||
* Context::~Context
|
||||
* GetIntegerv (2D\_BINDING, CUBE\_BINDING)
|
||||
* Context::applyTextures
|
||||
* Context::detachTexture
|
||||
* Program::getSamplerMapping
|
||||
* Program::dirtyAllSamplers
|
||||
* Program::applyUniform1iv
|
||||
* Program::unlink
|
||||
* Program::validateSamplers
|
||||
4. handling the nasty corner cases: texture formats, filtering and cube
|
||||
textures.
|
||||
* OpenGL doesn't provide any restrictions on what formats and/or types of
|
||||
textures can used for vertex textures, or if filtering can be enabled,
|
||||
whereas D3D9 does.
|
||||
* Reference Rasterizer / Software Vertex Processing: all formats & types
|
||||
supported (including filtering)
|
||||
* ATI R500 (on Google Code) cards do not support VTF (even though they are
|
||||
SM 3.0)
|
||||
* ATI R600 (on Google Code) (and later) and in theory the Intel 965+,
|
||||
claim to support all texture formats/types we care about and some with
|
||||
filtering
|
||||
* NVIDIA cards fall into two camps:
|
||||
* dx9 SM3 (6&7 series): only R32F & A32B32G32R32F supported for 2D and no
|
||||
filtering, CUBE or VOL texture support
|
||||
* dx10 (8+ series): only float texture formats for 2D, CUBE & VOLUME. no
|
||||
filtering (according to caps)
|
||||
* further info from Aras P. suggests that all formats are supported on
|
||||
DX10 hardware, but are just not advertised.
|
||||
* unsure what they do on these cards under OpenGL. Need to do more
|
||||
testing, but suspect software fallback.
|
||||
@@ -1,50 +0,0 @@
|
||||
# How to write ANGLE shader translator AST transformations
|
||||
|
||||
Usually, a shader AST transformation is structured as such:
|
||||
|
||||
**.h file**: one function taking a node to transform, often the root node. If the transformation needs to create new variables or functions, you need to pass a pointer to the TSymbolTable as well (all functions and variables need an id number that's based on a counter in TSymbolTable).
|
||||
|
||||
class TIntermBlock;
|
||||
TransformAST(TIntermBlock *root)
|
||||
|
||||
**.cpp file**: implementation of the transformation, with all the implementation code in an anonymous namespace.
|
||||
|
||||
## Utilities to implement a transformation
|
||||
|
||||
The utilities for implementing AST transformations are in **src/compiler/translator/tree_util/**
|
||||
|
||||
**TIntermTraverser**: This traverses the tree recursively, visiting all nodes. Override the visit* functions you need.
|
||||
|
||||
**TLValueTrackingTraverser**: If you need to know if the node that is being visited is a target of a write (used as an l-value), use TLValueTrackingTraverser and its isLValueRequiredHere() function.
|
||||
|
||||
If you're only interested in function declarations or global variables, they're all in the global scope, so you can get away with just iterating over the root block instead of using a traverser.
|
||||
|
||||
TIntermTraverser has member functions to insert and replace nodes. To remove a node, replace it with an empty list. Usually visit functions queue replacements and then updateTree() is called after the traversal is complete - this way the replacement doesn't affect the current traversal. For some transformations of nested AST structures you may need to do multiple traversals.
|
||||
|
||||
**BuiltIn.h**: With the helpers here you can easily and cheaply create references to built-in variables that are stored as constexpr.
|
||||
|
||||
**IntermNode_utils.h**: These utilities can do things like create a zero node with an arbitrary type, create bool nodes, index nodes, or operations on temporary variables.
|
||||
|
||||
**RunAtTheEndOfShader.h**: Use this when you need to run code at the end of the shader so you don't need to worry about corner cases like return statements in main().
|
||||
|
||||
**ReplaceVariable.h**: Replace all references to a specific variable in the AST. Useful if a type of a variable needs to be changed, for example.
|
||||
|
||||
**FindMain.h**: Find the main() function in the AST.
|
||||
|
||||
**FindSymbolNode.h**: Find a particular symbol in the AST.
|
||||
|
||||
**IntermNodePatternMatcher.h**: This helper matches certain AST patterns that are needed in more than one different transformation, such as expressions returning an array.
|
||||
|
||||
**StaticType.h**: Create TType objects that are initialized at compile time.
|
||||
|
||||
Some member functions of AST nodes can also be useful:
|
||||
* **deepCopy()** creates a copy of any typed node, including its children.
|
||||
* **hasSideEffects()** determines whether an expression might have side effects. Usually we want to avoid removing nodes with side effects unless there's certainty they would never be executed.
|
||||
|
||||
## Checklist
|
||||
|
||||
When implementing traversers, be careful that:
|
||||
* Each node will only have one parent (multiple parents could mess up further AST transformations)
|
||||
* You take into account some less common AST structures, such as declarations inside a loop header.
|
||||
* You run the transformation at the right stage of compilation. You don't want to reintroduce AST structures that have already been pruned away for example, and on the other hand you can depend on earlier transformations to clean up some inconvenient structures from the AST, like empty declarations or multiple variables declared on the same line.
|
||||
* Make sure that any functions you add are marked with SymbolType::AngleInternal so they exist in a separate namespace from user-defined names and can't conflict with them.
|
||||
@@ -1,124 +0,0 @@
|
||||
# Charts
|
||||
|
||||
These charts are generated nightly from the [chrome GPU waterfall bots](https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console?limit=200). The output of dEQP tests are parsed by [generate_stats.py](https://chromium.googlesource.com/angle/angle/+/HEAD/scripts/generate_stats.py) and collected into a Sheet here: https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek
|
||||
|
||||
Warning: the charts below that are wrapped by iframe tags may not display
|
||||
properly on GitHub Markdown. The charts can be viewed best on the
|
||||
[Chromium repo page](https://chromium.googlesource.com/angle/angle/+/HEAD/doc/dEQP-Charts.md).
|
||||
|
||||
[TOC]
|
||||
|
||||
## Win Desktop OpenGL Charts
|
||||
|
||||
[https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=2131794282](https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=2131794282)
|
||||
|
||||
<iframe id="GLES 2.0 Desktop OpenGL Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=2017908944&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Desktop OpenGL Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1311087567&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 Desktop OpenGL Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=786488695&format=interactive"></iframe>
|
||||
|
||||
<iframe id="EGL Desktop OpenGL Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=485763259&format=interactive"></iframe>
|
||||
|
||||
## Win Vulkan Charts
|
||||
|
||||
[https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=88272764](https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=88272764)
|
||||
|
||||
<iframe id="GLES 2.0 Vulkan Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1224536816&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Vulkan Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=470578632&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 Vulkan Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=304442659&format=interactive"></iframe>
|
||||
|
||||
<iframe id="EGL Vulkan Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=907538347&format=interactive"></iframe>
|
||||
|
||||
### KHR
|
||||
|
||||
<iframe id="GLES 2.0 Vulkan khr Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1264555977&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Vulkan khr Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=884611147&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 Vulkan khr Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=441071086&format=interactive"></iframe>
|
||||
|
||||
## Win D3D11 Charts
|
||||
|
||||
[https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=1236517289](https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=1236517289)
|
||||
|
||||
<iframe id="GLES 2.0 D3D11 Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=2018286499&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 D3D11 Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=725892266&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 D3D11 Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=415437873&format=interactive"></iframe>
|
||||
|
||||
<iframe id="EGL D3D11 Win10 NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1558331750&format=interactive"></iframe>
|
||||
|
||||
## Mac Desktop Open GL Charts
|
||||
|
||||
[https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=745187740](https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=745187740)
|
||||
|
||||
<iframe id="GLES 2.0 Desktop OpenGL Mac AMD" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=405516565&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Desktop OpenGL Mac AMD" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1993001882&format=interactive"></iframe>
|
||||
|
||||
<iframe id="EGL Desktop OpenGL Mac AMD" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=718088219&format=interactive"></iframe>
|
||||
|
||||
## Linux Desktop Open GL Charts
|
||||
|
||||
[https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=518000832](https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=518000832)
|
||||
|
||||
<iframe id="GLES 2.0 Desktop OpenGL Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1000752961&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Desktop OpenGL Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=658136720&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 Desktop OpenGL Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=637777434&format=interactive"></iframe>
|
||||
|
||||
<iframe id="EGL Desktop OpenGL Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1262725407&format=interactive"></iframe>
|
||||
|
||||
## Linux Vulkan Charts
|
||||
|
||||
[https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=1271046732](https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=1271046732)
|
||||
|
||||
<iframe id="GLES 2.0 Vulkan Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=2098104121&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Vulkan Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1985365791&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 Vulkan Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=288024561&format=interactive"></iframe>
|
||||
|
||||
<iframe id="EGL Vulkan Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1792478091&format=interactive"></iframe>
|
||||
|
||||
### KHR
|
||||
|
||||
<iframe id="GLES 2.0 Vulkan khr Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1734147637&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Vulkan khr Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1396798929&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 Vulkan khr Linux NVIDIA" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=383448866&format=interactive"></iframe>
|
||||
|
||||
## Android Vulkan Charts
|
||||
|
||||
[https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=703637628](https://docs.google.com/spreadsheets/d/1uttk1z8lJ4ZsUY7wMdFauMzUxb048nh5l52zdrAznek/edit#gid=703637628)
|
||||
|
||||
<iframe id="GLES 2.0 Vulkan Android 64 Pixel 2" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1563521823&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Vulkan Android 64 Pixel 2" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=330631789&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 Vulkan Android 64 Pixel 2" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1089048598&format=interactive"></iframe>
|
||||
|
||||
<iframe id="EGL Vulkan Android 64 Pixel 2" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=345901518&format=interactive"></iframe>
|
||||
|
||||
### KHR
|
||||
|
||||
<iframe id="GLES 2.0 Vulkan khr Android 64 Pixel 2" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=1369552559&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.0 Vulkan khr Android 64 Pixel 2" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=211294637&format=interactive"></iframe>
|
||||
|
||||
<iframe id="GLES 3.1 Vulkan khr Android 64 Pixel 2" width="1200px" height="371px" class="noborder" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubchart?oid=679956702&format=interactive"></iframe>
|
||||
|
||||
## Unexpected Passes/Failures
|
||||
|
||||
The latest list of unexpected passed/failed tests on HEAD.
|
||||
Each test is followed by a list of links to any builds on which they passed/failed unexpectedly.
|
||||
|
||||
<iframe id="Unexpected Passed Tests" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubhtml?gid=227024905&single=true&widget=true&headers=false" width="100%" height="600px"></iframe>
|
||||
|
||||
<iframe id="Unexpected Failed Tests" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQKyd5j9B0BOl-SuEYeJfIdhYF8EZzASSA7M3nZeLL54i-7iAfEMx0kX7SF_CiwU7DrX8THgn6VKX8a/pubhtml?gid=101098052&single=true&widget=true&headers=false" width="100%" height="600px"></iframe>
|
||||
88
doc/dEQP.md
88
doc/dEQP.md
@@ -1,88 +0,0 @@
|
||||
# ANGLE + dEQP
|
||||
|
||||
drawElements (dEQP) is a very robust and comprehensive set of open-source
|
||||
tests for GLES2, GLES3+ and EGL. They provide a huge net of coverage for
|
||||
almost every GL API feature. ANGLE by default builds dEQP testing targets for
|
||||
testing against GLES 2, GLES 3, EGL, and GLES 3.1 (on supported platforms).
|
||||
|
||||
## How to build dEQP
|
||||
|
||||
You should have dEQP as a target if you followed the [DevSetup](DevSetup.md)
|
||||
instructions. Current targets:
|
||||
|
||||
* `angle_deqp_gles2_tests` for GLES 2.0 tests
|
||||
* `angle_deqp_gles2_no_gtest` for GLES 2.0 tests without google test suite
|
||||
* `angle_deqp_gles3_tests` for GLES 3.0 tests
|
||||
* `angle_deqp_gles3_no_gtest` for GLES 3.0 tests without google test suite
|
||||
* `angle_deqp_egl_tests` for EGL 1.x tests
|
||||
* `angle_deqp_egl_no_gtest` for EGL 1.x tests without google test suite
|
||||
* `angle_deqp_gles31_tests` for GLES 3.1 tests (currently very experimental)
|
||||
* `angle_deqp_gles31_no_gtest` for GLES 3.1 tests (currently very experimental) without google test suite
|
||||
|
||||
## How to use dEQP
|
||||
|
||||
Note:
|
||||
To run an individual test, use the `--deqp-case` flag on any of the `no_gtest` targets.
|
||||
It supports simple wildcard support. For example: `--deqp-case=dEQP-
|
||||
GLES2.functional.shaders.linkage.*`.
|
||||
The `gtest` targets support wildcards via the `--gtest_filter` argument,
|
||||
but have different test names.
|
||||
|
||||
The tests lists are sourced from the Android CTS masters in
|
||||
`third_party/VK-GL-CTS/src/android/cts/master`. See `gles2-master.txt`,
|
||||
`gles3-master.txt`, `gles31-master.txt` and `egl-master.txt`.
|
||||
|
||||
If you're running a full test suite, it might take very long time. Running in
|
||||
Debug is only useful to isolate and fix particular failures, Release will give
|
||||
a better sense of total passing rate.
|
||||
|
||||
### Choosing a Renderer
|
||||
|
||||
By default ANGLE tests with D3D11 on Windows, GLES on mobile and Desktop GL otherwise.
|
||||
To specify the exact platform for ANGLE + dEQP, use the arguments:
|
||||
|
||||
* `--deqp-egl-display-type=angle-d3d11` for D3D11 (highest available feature level)
|
||||
* `--deqp-egl-display-type=angle-d3d9` for D3D9
|
||||
* `--deqp-egl-display-type=angle-d3d11-fl93` for D3D11 Feature level 9_3
|
||||
* `--deqp-egl-display-type=angle-gl` for OpenGL Desktop (OSX, Linux and Windows)
|
||||
* `--deqp-egl-display-type=angle-gles` for OpenGL ES (Android/ChromeOS, some Windows platforms)
|
||||
* `--deqp-egl-display-type=angle-metal` for Metal (Mac)
|
||||
* `--deqp-egl-display-type=angle-swiftshader` for Vulkan with SwiftShader as driver (Android, Linux, Mac, Windows)
|
||||
* `--deqp-egl-display-type=angle-vulkan` for Vulkan (Android, Linux, Windows)
|
||||
|
||||
The flag `--use-angle=X` has the same effect as `--deqp-egl-display-type=angle-X`.
|
||||
|
||||
### Check your results
|
||||
|
||||
If run from Visual Studio 2015, dEQP generates a test log to
|
||||
`out/sln/obj/src/tests/TestResults.qpa`. To view the test log information, you'll need to
|
||||
use the open-source GUI
|
||||
[Cherry](https://android.googlesource.com/platform/external/cherry). ANGLE
|
||||
checks out a copy of Cherry to `angle/third_party/cherry` when you sync with
|
||||
gclient. Note, if you are using ninja or another build system, the qpa file
|
||||
will be located in your working directory.
|
||||
|
||||
See the [official Cherry README](https://android.googlesource.com/platform/external/cherry/+/master/README)
|
||||
for instructions on how to run Cherry on Linux or Windows.
|
||||
|
||||
### GoogleTest, ANGLE and dEQP
|
||||
|
||||
ANGLE also supports the same set of targets built with GoogleTest, for running
|
||||
on the bots. We don't currently recommend using these for local debugging, but
|
||||
we do maintain lists of test expectations in `src/tests/deqp_support` (see
|
||||
[Handling Test Failures](TestingAndProcesses.md)). When
|
||||
you fix tests, please remove the suppression(s) from the relevant files!
|
||||
|
||||
### Running dEQP on Android
|
||||
|
||||
When you only need to run a few tests with `--gtest_filter` you can use Android wrappers such as `angle_deqp_egl_tests` directly but beware that Android test runner wipes data by default (try `--skip-clear-data`).
|
||||
|
||||
Running the tests not using the test runner is tricky, but is necessary in order to get a complete TestResults.qpa from the dEQP tests when running many tests (since the runner shards the tests, only the results of the last shard will be available when using the test runner). First, use the runner to install the APK, test data and test expectations on the device. After the tests start running, the test runner can be stopped with Ctrl+C. Then, run
|
||||
```
|
||||
adb shell am start -a android.intent.action.MAIN -n org.chromium.native_test/.NativeUnitTestNativeActivity -e org.chromium.native_test.NativeTest.StdoutFile /sdcard/chromium_tests_root/out.txt
|
||||
```
|
||||
After the tests finish, get the results with (requires `adb root`)
|
||||
```
|
||||
adb pull /data/data/com.android.angle.test/TestResults.qpa .
|
||||
```
|
||||
Note: this location might change, one can double-check with `adb logcat -d | grep qpa`.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 41 KiB |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 21 KiB |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 5.8 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 314 KiB |
@@ -1,10 +0,0 @@
|
||||
# Copyright 2018 The ANGLE Project Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
# This file contains variables that can be imported into a repo's dotfile (.gn)
|
||||
# to make it easier to roll new versions of ANGLE in.
|
||||
|
||||
angle_dotfile_settings = {
|
||||
exec_script_whitelist = [ get_path_info("BUILD.gn", "abspath") ]
|
||||
}
|
||||
@@ -1,226 +0,0 @@
|
||||
Name
|
||||
|
||||
ANGLE_base_vertex_base_instance
|
||||
|
||||
Name Strings
|
||||
|
||||
GL_ANGLE_base_vertex_base_instance
|
||||
|
||||
Contributors
|
||||
|
||||
Shrek Shao, Google Inc.
|
||||
Contributors to the OES_draw_elements_base_vertex specification
|
||||
Contributors to the EXT_draw_elements_base_vertex specification
|
||||
Contributors to the EXT_multi_draw_arrays specification
|
||||
Contributors to the ARB_shader_draw_parameters specification
|
||||
|
||||
Contact
|
||||
|
||||
Shrek Shao (shrekshao 'at' google.com)
|
||||
|
||||
Status
|
||||
|
||||
Incomplete
|
||||
|
||||
Version
|
||||
|
||||
Last Modified Date: Nov 19, 2021
|
||||
Author Revision: 3
|
||||
|
||||
Number
|
||||
|
||||
OpenGL ES Extension XX
|
||||
|
||||
Dependencies
|
||||
|
||||
OpenGL ES 3.1 is required.
|
||||
|
||||
This extension is written against the OpenGL ES 3.1 specification, the
|
||||
OpenGL ES 3.2 specification, and the OpenGL ES Shading Language 3.0
|
||||
specification.
|
||||
|
||||
GL_ANGLE_multi_draw is required.
|
||||
|
||||
Overview
|
||||
|
||||
This extension exposes the *BaseVertex* draw call in
|
||||
OES_draw_elements_base_vertex/EXT_draw_elements_base_vertex together with
|
||||
their newly added *BaseInstance and MultiDraw* variants in addition to the
|
||||
vertex shader builtins <gl_BaseVertex> and <gl_BaseInstance> exposed by
|
||||
ARB_shader_draw_parameters for OpenGL.
|
||||
|
||||
*BaseInstance behaves identically to its counterpart draw calls except that
|
||||
<instanceCount> instances of the range of elements are executed and the
|
||||
value of <instance> advances for each iteration. Those attributes that have
|
||||
non-zero values for <divisor>, as specified by VertexAttribDivisor, advance
|
||||
once per <divisor> instances of the set(s) of vertices being rendered.
|
||||
Additionally, <baseInstance> specifies the first element within the
|
||||
instanced vertex attributes.
|
||||
|
||||
*BaseVertex* is equivalent to its counterpart draw calls except that
|
||||
the value of the base vertex passed into the driver is <baseVertex> instead
|
||||
of zero, and that <instances> of the set of elements are executed and the
|
||||
value of <instance> advances between each set.
|
||||
|
||||
IP Status
|
||||
|
||||
No known IP claims.
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
void DrawArraysInstancedBaseInstanceANGLE(enum mode,
|
||||
int first,
|
||||
sizei count,
|
||||
sizei instanceCount,
|
||||
uint baseInstance);
|
||||
|
||||
void DrawElementsInstancedBaseVertexBaseInstanceANGLE(enum mode,
|
||||
sizei count,
|
||||
enum type,
|
||||
const void *indices,
|
||||
sizei instanceCount,
|
||||
int baseVertex,
|
||||
uint baseInstance);
|
||||
|
||||
void MultiDrawArraysInstancedBaseInstanceANGLE(enum mode,
|
||||
const int *firsts,
|
||||
const sizei *counts,
|
||||
const sizei *instanceCounts,
|
||||
const uint *baseInstances,
|
||||
sizei drawcount);
|
||||
|
||||
void MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(enum mode,
|
||||
const sizei *counts,
|
||||
enum type,
|
||||
const void *const *indices,
|
||||
const sizei *instanceCounts,
|
||||
const int *baseVertices,
|
||||
const uint *baseInstances,
|
||||
sizei drawcount);
|
||||
|
||||
New Tokens
|
||||
|
||||
None.
|
||||
|
||||
Additions to Chapter 10 of the OpenGL ES 3.2 Specification
|
||||
|
||||
Section 10.5 Drawing Commands Using Vertex Arrays:
|
||||
|
||||
The command
|
||||
|
||||
void DrawArraysInstancedBaseInstanceANGLE(
|
||||
enum mode,
|
||||
int first,
|
||||
sizei count,
|
||||
sizei instanceCount,
|
||||
uint baseInstance);
|
||||
|
||||
Behaves identically to DrawArraysInstanced except that <baseInstance> is
|
||||
passed down to DrawArraysOneInstance instead of zero.
|
||||
|
||||
The command
|
||||
|
||||
void MultiDrawArraysInstancedBaseInstanceANGLE(
|
||||
enum mode,
|
||||
const int *firsts,
|
||||
const sizei *counts,
|
||||
const sizei *instanceCounts,
|
||||
const uint *baseInstances,
|
||||
sizei drawcount);
|
||||
|
||||
Behaves identically to DrawArraysInstancedBaseInstanceANGLE except that a
|
||||
list of arrays is specified instead. The number of lists is specified in
|
||||
the <drawcount> parameter. It has the same effect as:
|
||||
|
||||
for(i=0; i<drawcount; i++) {
|
||||
if (*(counts+i)>0) DrawArraysInstancedBaseInstance(
|
||||
mode,
|
||||
*(counts+i),
|
||||
*(instanceCounts+i),
|
||||
*(firsts+i),
|
||||
*(baseInstance+i)
|
||||
);
|
||||
}
|
||||
|
||||
The index of the draw (<i> in the above pseudo-code) may be read by
|
||||
a vertex shader as <gl_DrawID> which is defined in GL_ANGLE_multi_draw.
|
||||
|
||||
The command
|
||||
|
||||
void DrawElementsInstancedBaseVertexBaseInstanceANGLE(
|
||||
enum mode,
|
||||
sizei count,
|
||||
enum type,
|
||||
const void *indices,
|
||||
sizei instanceCount,
|
||||
int baseVertex,
|
||||
uint baseInstance);
|
||||
|
||||
Behaves identically to DrawElementsInstanced except that <baseVertex> and
|
||||
<baseInstance> are passed down to DrawElementsOneInstance instead of zero.
|
||||
|
||||
The command
|
||||
|
||||
void MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(
|
||||
enum mode,
|
||||
const sizei *counts,
|
||||
enum type,
|
||||
const void *const *indices,
|
||||
const sizei *instanceCounts,
|
||||
const int *baseVertices,
|
||||
const uint *baseInstances,
|
||||
sizei drawcount);
|
||||
|
||||
Behaves identically to DrawElementsInstancedBaseVertexBaseInstanceANGLE
|
||||
except that a list of arrays is specified instead. The number of lists is
|
||||
specified in the <drawcount> parameter. It has the same effect as:
|
||||
|
||||
for(i=0; i<drawcount; i++) {
|
||||
if (*(counts+i)>0) DrawElementsInstancedBaseVertexBaseInstanceANGLE(
|
||||
mode,
|
||||
*(counts+i),
|
||||
type,
|
||||
*(instanceCounts+i),
|
||||
*(indices+i),
|
||||
*(baseVertices+i),
|
||||
*(baseInstances+i)
|
||||
);
|
||||
}
|
||||
|
||||
The index of the draw (<i> in the above pseudo-code) may be read by
|
||||
a vertex shader as <gl_DrawID> which is defined in GL_ANGLE_multi_draw.
|
||||
|
||||
Errors
|
||||
|
||||
DrawArraysInstancedBaseInstanceANGLE and
|
||||
DrawElementsInstancedBaseVertexBaseInstanceANGLE
|
||||
generate the same errors as DrawArraysInstanced and DrawElementsInstanced.
|
||||
|
||||
MultiDrawArraysInstancedBaseInstanceANGLE and
|
||||
MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE
|
||||
generate the same errors as DrawArraysInstanced and DrawElementsInstanced,
|
||||
respectively, for any draw <i> where an error is generated. If any call
|
||||
would produce an error, no drawing is performed.
|
||||
|
||||
The error INVALID_VALUE is generated by the MultiDraw* functions if
|
||||
<drawcount> is less than zero.
|
||||
|
||||
Dependencies on GL_OES_draw_elements_base_vertex and
|
||||
GL_EXT_draw_elements_base_vertex
|
||||
|
||||
If the OpenGL ES context version is less than 3.2, this extension is only
|
||||
available when GL_OES_draw_elements_base_vertex or
|
||||
GL_EXT_draw_elements_base_vertex are available.
|
||||
|
||||
Issues
|
||||
|
||||
None
|
||||
|
||||
Revision History
|
||||
|
||||
Rev. Date Author Changes
|
||||
---- -------- ---------------- --------------------------------------------
|
||||
1 08/13/19 Shrek Shao First revision.
|
||||
2 07/14/20 Shrek Shao Fix baseInstance type from GLint to GLuint.
|
||||
3 11/19/21 Shrek Shao Decouple gl_BaseVertex/gl_BaseInstance.
|
||||
4 06/21/22 Alexey Knyazev Fixed typos and type usage.
|
||||
@@ -1,142 +0,0 @@
|
||||
Name
|
||||
|
||||
ANGLE_base_vertex_base_instance_shader_builtin
|
||||
|
||||
Name Strings
|
||||
|
||||
GL_ANGLE_base_vertex_base_instance_shader_builtin
|
||||
|
||||
Contributors
|
||||
|
||||
Shrek Shao, Google Inc.
|
||||
Contributors to the ANGLE_base_vertex_base_instance specification
|
||||
Contributors to the ARB_shader_draw_parameters specification
|
||||
|
||||
Contact
|
||||
|
||||
Shrek Shao (shrekshao 'at' google.com)
|
||||
|
||||
Status
|
||||
|
||||
Incomplete
|
||||
|
||||
Version
|
||||
|
||||
Last Modified Date: Nov 19, 2021
|
||||
Author Revision: 1
|
||||
|
||||
Number
|
||||
|
||||
OpenGL ES Extension XX
|
||||
|
||||
Dependencies
|
||||
|
||||
The extension is based on ANGLE_base_vertex_base_instance, all limitations of which
|
||||
apply to this extension.
|
||||
|
||||
Overview
|
||||
|
||||
This extension is based on ANGLE_base_vertex_base_instance. It should be enabled
|
||||
only if ANGLE_base_vertex_base_instance is enabled.
|
||||
|
||||
Additional to the functionality exposed by ANGLE_base_vertex_base_instance,
|
||||
<gl_BaseVertex> and <gl_BaseInstance> builtins are added to the shading language.
|
||||
For any *BaseVertex* draw call variant, the <baseVertex> of the draw may be
|
||||
read by the vertex shader as <gl_BaseVertex>. For non *BaseVertex* calls,
|
||||
the value of <gl_BaseVertex> is 0.
|
||||
For any *BaseInstance draw call variant, the baseInstance of the draw may
|
||||
be read by the vertex shader as <gl_BaseInstance>. For non *BaseInstance
|
||||
calls, the value of <gl_BaseInstance> is 0.
|
||||
|
||||
IP Status
|
||||
|
||||
No known IP claims.
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
None.
|
||||
|
||||
New Tokens
|
||||
|
||||
None.
|
||||
|
||||
Additions to Chapter 10 of the OpenGL ES 3.2 Specification
|
||||
|
||||
Section 10.5 Drawing Commands Using Vertex Arrays:
|
||||
|
||||
The base index of the instance may be read by a vertex shader as
|
||||
<gl_BaseInstance>, for the commands
|
||||
|
||||
void DrawArraysInstancedBaseInstanceANGLE(
|
||||
enum mode,
|
||||
int first,
|
||||
sizei count,
|
||||
sizei instanceCount,
|
||||
uint baseInstance);
|
||||
|
||||
and
|
||||
|
||||
void MultiDrawArraysInstancedBaseInstanceANGLE(
|
||||
enum mode,
|
||||
const int *firsts,
|
||||
const sizei *counts,
|
||||
const sizei *instanceCounts,
|
||||
const uint *baseInstances,
|
||||
sizei drawcount);
|
||||
|
||||
The base index of the vertex may be read by a vertex shader as
|
||||
<gl_BaseVertex>. This value is also added to the <gl_VertexID>.
|
||||
|
||||
The base index of the instance may be read by a vertex shader as
|
||||
<gl_BaseInstance>. Note that this value is not added to the
|
||||
<gl_InstanceID>, for the commands
|
||||
|
||||
void DrawElementsInstancedBaseVertexBaseInstanceANGLE(
|
||||
enum mode,
|
||||
sizei count,
|
||||
enum type,
|
||||
const void *indices,
|
||||
sizei instanceCount,
|
||||
int baseVertex,
|
||||
uint baseInstance);
|
||||
|
||||
and
|
||||
|
||||
void MultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(
|
||||
enum mode,
|
||||
const sizei *counts,
|
||||
enum type,
|
||||
const void *const *indices,
|
||||
const sizei *instanceCounts,
|
||||
const int *baseVertices,
|
||||
const uint *baseInstances,
|
||||
sizei drawcount);
|
||||
|
||||
Errors
|
||||
|
||||
None.
|
||||
|
||||
Modifications to the OpenGL ES Shading Language Specification, Version 3.00
|
||||
|
||||
Including the following line in a shader controls the
|
||||
language featured described in this extension:
|
||||
|
||||
#extension GL_ANGLE_base_vertex_base_instance_shader_builtin : <behavior>
|
||||
|
||||
where <behavior> is as specified in section 3.5.
|
||||
|
||||
A new preprocessor #define is added to the OpenGL ES Shading Language:
|
||||
|
||||
#define GL_ANGLE_base_vertex_base_instance_shader_builtin 1
|
||||
|
||||
|
||||
Issues
|
||||
|
||||
None
|
||||
|
||||
Revision History
|
||||
|
||||
Rev. Date Author Changes
|
||||
---- -------- ---------------- --------------------------------------------
|
||||
1 11/19/21 Shrek Shao First revision.
|
||||
2 06/21/22 Alexey Knyazev Fixed typos and type usage.
|
||||
@@ -1,103 +0,0 @@
|
||||
Name
|
||||
|
||||
ANGLE_client_arrays
|
||||
|
||||
Name Strings
|
||||
|
||||
GL_ANGLE_client_arrays
|
||||
|
||||
Contributors
|
||||
|
||||
Geoff Lang
|
||||
|
||||
Contact
|
||||
|
||||
Geoff Lang (geofflang 'at' google.com)
|
||||
|
||||
Notice
|
||||
|
||||
Copyright (c) 2016 The Khronos Group Inc. Copyright terms at
|
||||
http://www.khronos.org/registry/speccopyright.html
|
||||
|
||||
Status
|
||||
|
||||
Draft
|
||||
|
||||
Version
|
||||
|
||||
Version 1, February 13, 2016
|
||||
|
||||
Number
|
||||
|
||||
OpenGL ES Extension #??
|
||||
|
||||
Dependencies
|
||||
|
||||
Requires OpenGL ES 2.0
|
||||
|
||||
Written against the OpenGL ES 2.0 specification.
|
||||
|
||||
Overview
|
||||
|
||||
This extension allows the OpenGL context to indicate if it supports drawing
|
||||
with client-side vertex or index data. Client-side can be very inefficient
|
||||
and unsafe, it is convenient for some users to completely disable its usage.
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
None
|
||||
|
||||
New Tokens
|
||||
|
||||
Accepted by the <cap> parameter to IsEnabled and the <pname> parameter to
|
||||
GetBooleanv, GetIntegerv, GetFloatv, and GetInteger64v:
|
||||
|
||||
CLIENT_ARRAYS_ANGLE 0x93AA
|
||||
|
||||
Additions to the OpenGL ES Specification
|
||||
|
||||
Add after paragraph 3 of section 2.8 "Vertex Arrays":
|
||||
|
||||
If VertexAttribPointer is called while zero is bound to the ARRAY_BUFFER
|
||||
buffer object binding point, the pointer argument is not NULL, and
|
||||
CLIENT_ARRAYS_ANGLE is TRUE, an INVALID_OPERATION error is generated.
|
||||
|
||||
Add to the end of section 2.9.1 "Vertex Arrays in Buffer Objects":
|
||||
|
||||
Rendering commands that draw more than 0 primitives using enabled vertex
|
||||
attributes with no buffer bound when CLIENT_ARRAYS_ANGLE is TRUE generate
|
||||
an INVALID_OPERATION error.
|
||||
|
||||
Add to the end of section 2.9.2 "Array Indices in Buffer Objects":
|
||||
|
||||
Rendering commands that draw using index data when no buffer is bound to
|
||||
the ELEMENT_ARRAY_BUFFER binding point when CLIENT_ARRAYS_ANGLE is TRUE
|
||||
generate an INVALID_OPERATION error.
|
||||
|
||||
New State
|
||||
|
||||
Modify Table 6.22, Miscellaneous
|
||||
|
||||
Add:
|
||||
|
||||
Initial
|
||||
Get Value Type Get Command Value Description
|
||||
-------------------- ---- ----------- ------- ---------------------
|
||||
CLIENT_ARRAYS_ANGLE B IsEnabled TRUE Client arrays enabled
|
||||
|
||||
Conformance Tests
|
||||
|
||||
TBD
|
||||
|
||||
Issues
|
||||
|
||||
None
|
||||
|
||||
Revision History
|
||||
|
||||
Rev. Date Author Changes
|
||||
---- ------------- --------- ----------------------------------------
|
||||
2 Jun 12, 2018 Brandon Jones (Intel) Remove primitives > 0 requirement to error
|
||||
when doing an indexed draw with no bound
|
||||
ELEMENT_ARRAY_BUFFER
|
||||
1 Feb 13, 2016 geofflang Initial version
|
||||
@@ -1,114 +0,0 @@
|
||||
Name
|
||||
|
||||
ANGLE_clip_cull_distance
|
||||
|
||||
Name Strings
|
||||
|
||||
GL_ANGLE_clip_cull_distance
|
||||
|
||||
Contributors
|
||||
|
||||
Contributors to EXT_clip_cull_distance
|
||||
Members of the WebGL working group
|
||||
|
||||
Status
|
||||
|
||||
Draft
|
||||
|
||||
Version
|
||||
|
||||
Last Modified Date: December 1, 2022
|
||||
Revision: 1
|
||||
|
||||
Number
|
||||
|
||||
OpenGL ES Extension XX
|
||||
|
||||
Dependencies
|
||||
|
||||
This specification is written against the OpenGL ES 3.2 Specification
|
||||
(May 5, 2022), and the OpenGL ES 3.20 Shading Language Specification
|
||||
(July 10, 2019) but can apply to prior specifications.
|
||||
|
||||
OpenGL ES 3.0 and OpenGL ES Shading Language 3.00 are required.
|
||||
|
||||
Overview
|
||||
|
||||
This extension has the same semantics as EXT_clip_cull_distance but
|
||||
the number of supported cull distances may be zero.
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
None
|
||||
|
||||
New Tokens
|
||||
|
||||
Accepted by the <pname> parameters of GetBooleanv, GetIntegerv,
|
||||
GetInteger64v, and GetFloatv:
|
||||
|
||||
MAX_CLIP_DISTANCES_ANGLE 0x0D32
|
||||
MAX_CULL_DISTANCES_ANGLE 0x82F9
|
||||
MAX_COMBINED_CLIP_AND_CULL_DISTANCES_ANGLE 0x82FA
|
||||
|
||||
Accepted by the <pname> parameters of Enable, Disable and IsEnabled:
|
||||
|
||||
CLIP_DISTANCE0_ANGLE 0x3000
|
||||
CLIP_DISTANCE1_ANGLE 0x3001
|
||||
CLIP_DISTANCE2_ANGLE 0x3002
|
||||
CLIP_DISTANCE3_ANGLE 0x3003
|
||||
CLIP_DISTANCE4_ANGLE 0x3004
|
||||
CLIP_DISTANCE5_ANGLE 0x3005
|
||||
CLIP_DISTANCE6_ANGLE 0x3006
|
||||
CLIP_DISTANCE7_ANGLE 0x3007
|
||||
|
||||
Additions to OpenGL ES Shading Language 3.20 Specification
|
||||
|
||||
Including the following line in a shader can be used to control
|
||||
the language features described in this extension:
|
||||
|
||||
#extension GL_ANGLE_clip_cull_distance : <behavior>
|
||||
|
||||
where <behavior> is as described in section 3.4.
|
||||
|
||||
A new preprocessor #define is added to the OpenGL ES Shading Language:
|
||||
|
||||
#define GL_ANGLE_clip_cull_distance 1
|
||||
|
||||
Other additions follow the EXT_clip_cull_distance specification.
|
||||
|
||||
Dependencies on cull distance support
|
||||
|
||||
If cull distances are not supported, querying MAX_CULL_DISTANCES_ANGLE
|
||||
and MAX_COMBINED_CLIP_AND_CULL_DISTANCES_ANGLE must return zero, the
|
||||
built-in constants gl_MaxCullDistances and gl_MaxCombinedClipAndCullDistances
|
||||
are defined as zero, and gl_CullDistance must not be used in shaders.
|
||||
|
||||
New State
|
||||
|
||||
Add the following to Table 21.6 (Transformation State):
|
||||
|
||||
Initial
|
||||
Get Value Type Get Command Value Description Sec.
|
||||
-------------------- ------ ----------- -------- ----------------- ----
|
||||
CLIP_DISTANCEi_ANGLE 8* x B IsEnabled FALSE ith user clip 12.5
|
||||
distance enabled
|
||||
|
||||
|
||||
New Implementation Dependent State
|
||||
|
||||
Add the following to Table 21.40 (Implementation Dependent Values):
|
||||
|
||||
Minimum
|
||||
Get Value Type Get Command Value Description Sec.
|
||||
------------------------ ---- ----------- -------- ----------------- ----
|
||||
MAX_CLIP_DISTANCES_ANGLE Z+ GetIntegerv 8 Max. no. of user 12.5
|
||||
clip distances
|
||||
MAX_CULL_DISTANCES_ANGLE Z+ GetIntegerv 0 Max. no. of user 12.5
|
||||
cull distances
|
||||
MAX_COMBINED_CLIP_AND- Z+ GetIntegerv 0 Max. combined no. 12.5
|
||||
_CULL_DISTANCES_ANGLE of user clip and
|
||||
cull distances
|
||||
|
||||
Revision History
|
||||
|
||||
12/1/2022 First revision
|
||||
@@ -1,73 +0,0 @@
|
||||
Name
|
||||
|
||||
ANGLE_compressed_texture_etc
|
||||
|
||||
Name Strings
|
||||
|
||||
GL_ANGLE_compressed_texture_etc
|
||||
|
||||
Version
|
||||
|
||||
Last Modifed Date: October 5, 2019
|
||||
|
||||
Dependencies
|
||||
|
||||
OpenGL ES 2.0 is required.
|
||||
|
||||
Overview
|
||||
|
||||
This extension exposes the OpenGL ES 3.0 core compressed texture
|
||||
formats in OpenGL ES 2.0.
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
None
|
||||
|
||||
New Tokens
|
||||
|
||||
Accepted by the <internalformat> parameter of CompressedTexImage2D and the
|
||||
<format> parameter of CompressedTexSubImage2D:
|
||||
|
||||
COMPRESSED_R11_EAC 0x9270
|
||||
COMPRESSED_SIGNED_R11_EAC 0x9271
|
||||
COMPRESSED_RG11_EAC 0x9272
|
||||
COMPRESSED_SIGNED_RG11_EAC 0x9273
|
||||
COMPRESSED_RGB8_ETC2 0x9274
|
||||
COMPRESSED_SRGB8_ETC2 0x9275
|
||||
COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
|
||||
COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
|
||||
COMPRESSED_RGBA8_ETC2_EAC 0x9278
|
||||
COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
|
||||
|
||||
Querying COMPRESSED_TEXTURE_FORMATS will include these new formats.
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
None.
|
||||
|
||||
Errors
|
||||
|
||||
The error INVALID_VALUE is generated if the <internalformat> parameter of
|
||||
CompressedTexImage2D or the <format> parameter of CompressedTexSubImage2D is
|
||||
COMPRESSED_R11_EAC, COMPRESSED_SIGNED_R11_EAC, COMPRESSED_RGB8_ETC2,
|
||||
COMPRESSED_SRGB8_ETC2, COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 or
|
||||
COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, and imageSize is not
|
||||
|
||||
floor((width + 3) / 4) * floor((height + 3) / 4) * 8
|
||||
|
||||
The error INVALID_VALUE is generated if the <internalformat> parameter of
|
||||
CompressedTexImage2D or the <format> paremeter of CompressedTexSubImage2D is
|
||||
COMPRESSED_RG11_EAC, COMPRESSED_SIGNED_RG11_EAC, COMPRESSED_RGBA8_ETC2_EAC,
|
||||
or COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, and imageSize is not
|
||||
|
||||
floor((width + 3) / 4) * floor((height + 3) / 4) * 16
|
||||
|
||||
|
||||
New State
|
||||
|
||||
None.
|
||||
|
||||
Revision History
|
||||
|
||||
9/19/2016 First revision
|
||||
10/5/2019 Rename to ANGLE_compressed_texture_etc
|
||||
@@ -1,225 +0,0 @@
|
||||
Name
|
||||
|
||||
ANGLE_copy_texture_3d
|
||||
|
||||
Name Strings
|
||||
|
||||
GL_ANGLE_copy_texture_3d
|
||||
|
||||
Contributors
|
||||
|
||||
Brandon Jones, Intel
|
||||
|
||||
Contacts
|
||||
|
||||
Brandon Jones, Intel (brandon1.jones 'at' intel 'dot' com)
|
||||
|
||||
Status
|
||||
|
||||
Implemented.
|
||||
|
||||
Version
|
||||
|
||||
Version 1, 2018-8-8
|
||||
|
||||
Dependencies
|
||||
|
||||
OpenGL ES 3.0 required.
|
||||
|
||||
Overview
|
||||
|
||||
This extension adds 3D texture support to the functionality
|
||||
provided by the CHROMIUM_copy_texture extension. Two new
|
||||
functions are exported, glCopyTexture3DANGLE and
|
||||
glCopySubTexture3DANGLE that perform the same copy operations as
|
||||
glCopyTextureCHROMIUM and glCopySubTextureCHROMIUM, respectively,
|
||||
on GL_TEXTURE_3D and GL_TEXTURE_2D_ARRAY bound textures.
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
void CopyTexture3DANGLE(uint sourceId,
|
||||
int sourceLevel,
|
||||
enum destTarget,
|
||||
uint destId,
|
||||
int destLevel,
|
||||
int internalFormat,
|
||||
enum destType,
|
||||
boolean unpackFlipY,
|
||||
boolean unpackPremultiplyAlpha,
|
||||
boolean unpackUnmultiplyAlpha)
|
||||
|
||||
void CopySubTexture3DANGLE(uint sourceId,
|
||||
int sourceLevel,
|
||||
enum destTarget,
|
||||
uint destId,
|
||||
int destLevel,
|
||||
int xoffset,
|
||||
int yoffset,
|
||||
int zoffset,
|
||||
int x,
|
||||
int y,
|
||||
int z,
|
||||
sizei width,
|
||||
sizei height,
|
||||
sizei depth,
|
||||
boolean unpackFlipY,
|
||||
boolean unpackPremultiplyAlpha,
|
||||
boolean unpackUnmultiplyAlpha)
|
||||
|
||||
Additions to the OpenGL ES 3.0 Specification
|
||||
|
||||
The command
|
||||
|
||||
CopyTexture3DANGLE
|
||||
|
||||
All CopyTexture3DANGLE behavior is the same as
|
||||
CopyTextureCHROMIUM unless otherwise defined below.
|
||||
|
||||
When source texture doesn't contain a superset of the component
|
||||
required by <internalFormat>, fill the components by the
|
||||
following rules.
|
||||
|
||||
source format color components
|
||||
----------------------------------------
|
||||
RED (R, 0, 0, 1)
|
||||
RED_INTEGER (R, 0, 0, 1)
|
||||
RG (R, G, 0, 1)
|
||||
RG_INTEGER (R, G, 0, 1)
|
||||
RGB (R, G, B, 1)
|
||||
RGB_INTEGER (R, G, B, 1)
|
||||
RGBA (R, G, B, A)
|
||||
RGBA_INTEGER (R, G, B, A)
|
||||
LUMINANCE_ALPHA (L, L, L, A)
|
||||
LUMINANCE (L, L, L, 1)
|
||||
ALPHA (0, 0, 0, A)
|
||||
|
||||
INVALID_OPERATION is generated if the format of <sourceId> is not
|
||||
one of formats in Table 1.1.
|
||||
|
||||
INVALID_ENUM is generated if <destTarget> is not TEXTURE_3D or
|
||||
TEXTURE_2D_ARRAY.
|
||||
|
||||
INVALID_VALUE is generated if the texture corresponding to
|
||||
<sourceId> has not been bound as <destTarget>.
|
||||
|
||||
INVALID_OPERATION is generated if <internalFormat> is not one of
|
||||
the sized internal formats in Table 1.0.
|
||||
|
||||
The command
|
||||
|
||||
CopySubTexture3DANGLE
|
||||
|
||||
All CopySubTexture3DANGLE behavior is the same as
|
||||
CopySubTextureCHROMIUM unless otherwise defined below.
|
||||
|
||||
<zoffset> specifies a texel offset in the z direction
|
||||
respectively within the destination texture.
|
||||
|
||||
<z> specifies a texel offset in the z direction respectively
|
||||
within the source texture.
|
||||
|
||||
<depth> specifies the depth of the texture subimage.
|
||||
|
||||
INVALID_ENUM is generated if <destTarget> is not TEXTURE_3D or
|
||||
TEXTURE_2D_ARRAY.
|
||||
|
||||
INVALID_VALUE is generated if the texture corresponding to
|
||||
<sourceId> and <destId> have not been bound as <destTarget>.
|
||||
|
||||
INVALID_VALUE is generated if either <sourceId> texture or
|
||||
<destId> texture is not defined.
|
||||
|
||||
INVALID_OPERATION is generated if the format of <sourceId> or
|
||||
<destId> is not one of formats in Table 1.1.
|
||||
|
||||
INVALID_VALUE is generated if zoffset is less than 0.
|
||||
|
||||
INVALID_VALUE is generated if z is less than 0.
|
||||
|
||||
INVALID_VALUE is generated if depth is less than 0.
|
||||
|
||||
INVALID_VALUE is generated if (<z> + <depth>) > srcDepth.
|
||||
|
||||
INVALID_VALUE is generated if (<zoffset> + <depth>) > destDepth.
|
||||
|
||||
Table 1.0 internal formats for CopyTexture3DANGLE:
|
||||
|
||||
<internalFormat>
|
||||
---------------
|
||||
RGB
|
||||
RGBA
|
||||
LUMINANCE
|
||||
LUMINANCE_ALPHA
|
||||
ALPHA
|
||||
R8
|
||||
R8_SNORM
|
||||
R16F
|
||||
R32F
|
||||
R8UI
|
||||
R8I
|
||||
R16UI
|
||||
R16I
|
||||
R32UI
|
||||
R32I
|
||||
RG8
|
||||
RG8_SNORM
|
||||
RG16F
|
||||
RG32F
|
||||
RG8UI
|
||||
RG8I
|
||||
RG16UI
|
||||
RG16I
|
||||
RG32UI
|
||||
RG32I
|
||||
RGB8
|
||||
SRGB8
|
||||
RGB565
|
||||
RGB8_SNORM
|
||||
R11F_G11F_B10F
|
||||
RGB9_E5
|
||||
RGB16F
|
||||
RGB32F
|
||||
RGB8UI
|
||||
RGB8I
|
||||
RGB16UI
|
||||
RGB16I
|
||||
RGB32UI
|
||||
RGB32I
|
||||
RGBA8
|
||||
SRGB8_ALPHA8
|
||||
RGBA8_SNORM
|
||||
RGB5_A1
|
||||
RGBA4
|
||||
RGB10_A2
|
||||
RGBA16F
|
||||
RGBA32F
|
||||
RGBA8UI
|
||||
RGBA8I
|
||||
RGB10_A2UI
|
||||
RGBA16UI
|
||||
RGBA16I
|
||||
RGBA32I
|
||||
RGBA32UI
|
||||
|
||||
Table 1.1 Valid source texture formats for
|
||||
CopyTexture3DANGLE and source and destination formats for
|
||||
CopySubTexture3DANGLE:
|
||||
|
||||
Format
|
||||
---------------
|
||||
RED
|
||||
RED_INTEGER
|
||||
RG
|
||||
RG_INTEGER
|
||||
RGB
|
||||
RGB_INTEGER
|
||||
RGBA
|
||||
RGBA_INTEGER
|
||||
LUMINANCE_ALPHA
|
||||
LUMINANCE
|
||||
ALPHA
|
||||
|
||||
Revision History
|
||||
|
||||
Version 1, 2018-8-8 (Brandon Jones)
|
||||
- Initial implementation.
|
||||
@@ -1,402 +0,0 @@
|
||||
Name
|
||||
|
||||
ANGLE_depth_texture
|
||||
|
||||
Name Strings
|
||||
|
||||
GL_ANGLE_depth_texture
|
||||
|
||||
Contributors
|
||||
|
||||
Nicolas Capens, TransGaming
|
||||
Daniel Koch, TransGaming
|
||||
Shannon Woods, TransGaming
|
||||
Kenneth Russell, Google
|
||||
Vangelis Kokkevis, Google
|
||||
Gregg Tavares, Google
|
||||
Contributors to OES_depth_texture
|
||||
Contributors to OES_packed_depth_stencil
|
||||
|
||||
Contact
|
||||
|
||||
Shannon Woods, TransGaming (shannon 'dot' woods 'at' transgaming.com)
|
||||
|
||||
Status
|
||||
|
||||
Implemented in ANGLE.
|
||||
|
||||
Version
|
||||
|
||||
Last Modified Date: February 25, 2013
|
||||
Revision: #4
|
||||
|
||||
Number
|
||||
|
||||
TBD
|
||||
|
||||
Dependencies
|
||||
|
||||
OpenGL ES 2.0 is required.
|
||||
This extension is written against the OpenGL ES 2.0.25 specification
|
||||
|
||||
OES_packed_depth_stencil affects the definition of this extension.
|
||||
|
||||
EXT_texture_storage affects the definition of this extension.
|
||||
|
||||
Overview
|
||||
|
||||
This extension defines support for 2D depth and depth-stencil
|
||||
textures in an OpenGL ES implementation.
|
||||
|
||||
This extension incorporates the depth texturing functionality of
|
||||
OES_depth_texture and OES_packed_depth_stencil, but does not
|
||||
provide the ability to load existing data via TexImage2D or
|
||||
TexSubImage2D. This extension also allows implementation
|
||||
variability in which components from a sampled depth texture
|
||||
contain the depth data. Depth textures created with this
|
||||
extension only support 1 level.
|
||||
|
||||
New Procedures and Functions
|
||||
|
||||
None
|
||||
|
||||
New Tokens
|
||||
|
||||
Accepted by the <format> parameter of TexImage2D and TexSubImage2D and
|
||||
<internalformat> parameter of TexImage2D:
|
||||
|
||||
DEPTH_COMPONENT 0x1902
|
||||
DEPTH_STENCIL_OES 0x84F9
|
||||
|
||||
Accepted by the <type> parameter of TexImage2D, TexSubImage2D:
|
||||
|
||||
UNSIGNED_SHORT 0x1403
|
||||
UNSIGNED_INT 0x1405
|
||||
UNSIGNED_INT_24_8_OES 0x84FA
|
||||
|
||||
Accepted by the <internalformat> parameter of TexStorage2DEXT:
|
||||
|
||||
DEPTH_COMPONENT16 0x81A5
|
||||
DEPTH_COMPONENT32_OES 0x81A7
|
||||
DEPTH24_STENCIL8_OES 0x88F0
|
||||
|
||||
Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)
|
||||
|
||||
Update Section 2.10.5 "Shader Execution" in the subsection titled
|
||||
"Texture Access" add a new paragraph before the last paragraph add
|
||||
this line:
|
||||
|
||||
"The stencil index texture internal component is ignored if the base
|
||||
internal format is DEPTH_STENCIL_OES.
|
||||
|
||||
If a vertex shader uses..."
|
||||
|
||||
Additions to Chapter 3 of the OpenGL ES 2.0 specification (Rasterization)
|
||||
|
||||
Add the following rows to Table 3.2 (page 62):
|
||||
|
||||
type Parameter GL Data Type Special
|
||||
------------------------------------------------
|
||||
... ... ...
|
||||
UNSIGNED_SHORT ushort No
|
||||
UNSIGNED_INT uint No
|
||||
UNSIGNED_INT_24_8_OES uint Yes
|
||||
|
||||
Add the following rows to Table 3.3 (page 62):
|
||||
|
||||
Format Name Element Meaning and Order Target Buffer
|
||||
------------------------------------------------------------------
|
||||
... ... ...
|
||||
DEPTH_COMPONENT Depth Depth
|
||||
DEPTH_STENCIL_OES Depth and Stencil Index Depth and Stencil
|
||||
... ... ...
|
||||
|
||||
Add a row to Table 3.5 "Packed pixel formats" (page 64):
|
||||
|
||||
type Parameter GL Type Components Pixel Formats
|
||||
------------------------------------------------------------------
|
||||
... ... ... ...
|
||||
UNSIGNED_INT_24_8_OES uint 2 DEPTH_STENCIL_OES
|
||||
|
||||
Add a new table after Table 3.6 (page 64):
|
||||
|
||||
UNSIGNED_INT_24_8_OES
|
||||
|
||||
31 30 29 28 27 26 ... 12 11 10 9 8 7 6 5 4 3 2 1 0
|
||||
+----------------------------------+---------------+
|
||||
| 1st Component | 2nd Component |
|
||||
+----------------------------------+---------------+
|
||||
|
||||
Table 3.6.B: UNSIGNED_INT formats
|
||||
|
||||
Add a row to Table 3.7 "Packed pixel field assignments" (page 65):
|
||||
|
||||
Format | 1st 2nd 3rd 4th
|
||||
------------------+-------------------------------
|
||||
... | ... ... ... ...
|
||||
DEPTH_STENCIL_OES | depth stencil N/A N/A
|
||||
|
||||
Add the following paragraph to the end of the section "Conversion to
|
||||
floating-point" (page 65):
|
||||
|
||||
"For groups of components that contain both standard components and index
|
||||
elements, such as DEPTH_STENCIL_OES, the index elements are not converted."
|
||||
|
||||
In section 3.7.1 "Texture Image Specification", update page 67 to
|
||||
say:
|
||||
|
||||
"The selected groups are processed as described in section 3.6.2, stopping
|
||||
just before final conversion. Each R, G, B, A, or depth value so generated
|
||||
is clamped to [0, 1], while the stencil index values are masked by 2^n-1,
|
||||
where n is the number of stencil bits in the internal format resolution
|
||||
(see below).
|
||||
|
||||
Components are then selected from the resulting R, G, B, A, depth, or
|
||||
stencil index values to obtain a texture with the base internal format
|
||||
specified by <internalformat>. Table 3.8 summarizes the mapping of R, G,
|
||||
B, A, depth, or stencil values to texture components, as a function of the
|
||||
base internal format of the texture image. <internalformat> may be
|
||||
specified as one of the internal format symbolic constants listed in
|
||||
table 3.8. Specifying a value for <internalformat> that is not one of the
|
||||
above values generates the error INVALID_VALUE. If <internalformat> does
|
||||
not match <format>, the error INVALID_OPERATION is generated.
|
||||
|
||||
Textures with a base internal format of DEPTH_COMPONENT or
|
||||
DEPTH_STENCIL_OES are supported by texture image specification commands
|
||||
only if <target> is TEXTURE_2D. Using these formats in conjunction with
|
||||
any other <target> will result in an INVALID_OPERATION error.
|
||||
|
||||
Textures with a base internal format of DEPTH_COMPONENT or
|
||||
DEPTH_STENCIL_OES only support one level of image data. Specifying a
|
||||
non-zero value for <level> will result in an INVALID_OPERATION error.
|
||||
|
||||
Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL_OES
|
||||
require either depth component data or depth/stencil component data.
|
||||
Textures with other base internal formats require RGBA component data. The
|
||||
error INVALID_OPERATION is generated if the base internal format is
|
||||
DEPTH_COMPONENT or DEPTH_STENCIL_OES and <format> is not DEPTH_COMPONENT or
|
||||
DEPTH_STENCIL_OES, or if the base internal format is not DEPTH_COMPONENT or
|
||||
DEPTH_STENCIL_OES and <format> is DEPTH_COMPONENT or DEPTH_STENCIL_OES.
|
||||
|
||||
Textures with a base internal format of DEPTH_COMPONENT or
|
||||
DEPTH_STENCIL_OES do not support loading image data via the TexImage
|
||||
commands. They can only have their contents specified by rendering
|
||||
to them. The INVALID_OPERATION error is generated by the TexImage2D
|
||||
command if <data> is not NULL for such textures."
|
||||
|
||||
Add a row to table 3.8 (page 68), and update the title of the
|
||||
second column:
|
||||
|
||||
Base Internal Format RGBA, Depth and Stencil Values Internal Components
|
||||
-------------------------------------------------------------------------
|
||||
... ... ...
|
||||
DEPTH_COMPONENT Depth D
|
||||
DEPTH_STENCIL_OES Depth,Stencil D,S
|
||||
... ... ...
|
||||
|
||||
Update the caption for table 3.8 (page 68)
|
||||
|
||||
"Table 3.8: Conversion from RGBA, depth, and stencil pixel components to
|
||||
internal texture components. Texture components R, G, B, A, and L are
|
||||
converted back to RGBA colors during filtering as shown in table 3.12.
|
||||
Texture components D are converted to RGBA colors as described in
|
||||
section 3.7.8-1/2."
|
||||
|
||||
Add the following to section 3.7.2 "Alternate Texture Image Specification
|
||||
Commands":
|
||||
|
||||
"CopyTexImage2D and CopyTexSubImage2D generate the INVALID_OPERATION
|
||||
error if the base internal format of the destination texture is
|
||||
DEPTH_COMPONENT or DEPTH_STENCIL_OES.
|
||||
|
||||
TexSubImage2D generates the INVALID_OPERATION error if the base internal
|
||||
format of the texture is DEPTH_COMPONENT or DEPTH_STENCIL_OES."
|
||||
|
||||
Add a new section between sections 3.7.8 and 3.7.9:
|
||||
|
||||
"3.7.8-1/2 Depth/Stencil Textures
|
||||
|
||||
If the currently bound texture's base internal format is DEPTH_COMPONENT or
|
||||
DEPTH_STENCIL_OES, then the output of the texture unit is as described
|
||||
below. Otherwise, the texture unit operates in the normal manner.
|
||||
|
||||
Let <D_t> be the depth texture value, provided by the shader's texture lookup
|
||||
function. Then the effective texture value is computed as follows:
|
||||
<Tau> = <D_t>
|
||||
|
||||
If the texture image has a base internal format of DEPTH_STENCIL_OES, then
|
||||
the stencil index texture component is ignored. The texture value <Tau> does
|
||||
not include a stencil index component, but includes only the depth
|
||||
component.
|
||||
|
||||
The resulting <Tau> is assigned to <R_t>. In some implementations, <Tau> is
|
||||
also assigned to <G_t>, <B_t>, or <A_t>. Thus in table 3.12, textures with
|
||||
depth component data behave as if their base internal format is RGBA, with
|
||||
values in <G_t>, <B_t>, and <A_t> being implementation dependent."
|
||||
|
||||
Add the following to section 3.7.11 "Mipmap Generation":
|
||||
|
||||
"If the level zero array contains depth or depth-stencil data, the
|
||||
error INVALID_OPERATION is generated."
|
||||
|
||||
Insert a new paragraph after the first paragraph of the "Texture Access"
|
||||
subsection of section 3.8.2 on page 87, which says:
|
||||
|
||||
"Texture lookups involving textures with depth component data generate
|
||||
a texture source color by using depth data directly, as described in
|
||||
section 3.7.8-1/2. The stencil texture internal component is ignored
|
||||
if the base internal format is DEPTH_STENCIL_OES."
|
||||
|
||||
Additions to Chapter 4 of the OpenGL ES 2.0 specification (Per-Fragment
|
||||
Operations and the Framebuffer)
|
||||
|
||||
In section 4.4.5 "Framebuffer Completeness", replace the the 3rd
|
||||
paragraph with the following text:
|
||||
|
||||
"* An internal format is color-renderable if it is one of the formats
|
||||
from table 4.5 noted as color-renderable or if it is unsized format
|
||||
RGBA or RGB. No other formats, including compressed internal formats,
|
||||
are color-renderable.
|
||||
|
||||
* An internal format is depth-renderable if it is one of the sized
|
||||
internal formats from table 4.5 noted as depth-renderable, if it
|
||||
is the unsized format DEPTH_COMPONENT or if it is the internal
|
||||
format value of DEPTH24_STENCIL8_OES. No other formats are
|
||||
depth-renderable.
|
||||
|
||||
* An internal format is stencil-renderable if it is one of the sized
|
||||
internal formats from table 4.5 noted as stencil-renderable or if it
|
||||
is DEPTH24_STENCIL8_OES. No other formats are stencil-renderable."
|
||||
|
||||
Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special
|
||||
Functions)
|
||||
|
||||
None.
|
||||
|
||||
Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State
|
||||
Requests)
|
||||
|
||||
None.
|
||||
|
||||
Interactions with OES_packed_depth_stencil
|
||||
|
||||
If OES_packed_depth_stencil is not supported, mentions of
|
||||
DEPTH_STENCIL_OES and UNSIGNED_INT_24_8_OES as a format/type combinations
|
||||
for TexImage2D and TexSubImage2D are omitted. Mentions of
|
||||
the internal format DEPTH24_STENCIL8_OES are also omitted.
|
||||
|
||||
Interactions with EXT_texture_storage
|
||||
|
||||
If EXT_texture_storage is supported the following internalformat
|
||||
to format/type mappings are used:
|
||||
|
||||
<internalformat> <format> <type>
|
||||
---------------- -------- ------
|
||||
DEPTH_COMPONENT16 DEPTH_COMPONENT UNSIGNED_SHORT
|
||||
DEPTH_COMPONENT32_OES DEPTH_COMPONENT UNSIGNED_INT
|
||||
DEPTH24_STENCIL8_OES DEPTH_STENCIL_OES UNSIGNED_INT
|
||||
|
||||
Textures with the above <internalformats> only support one level of
|
||||
image data. Specifying a value other than one for the <levels> parameter
|
||||
to TexStorage2DEXT will result in an INVALID_OPERATION error.
|
||||
|
||||
If EXT_texture_storage is not supported, ignore any references
|
||||
to TexStorage2DEXT.
|
||||
|
||||
Errors
|
||||
|
||||
The error INVALID_OPERATION is generated by TexImage2D if <format> and
|
||||
<internalformat> are DEPTH_COMPONENT and <type> is not UNSIGNED_SHORT,
|
||||
or UNSIGNED_INT.
|
||||
|
||||
The error INVALID_OPERATION is generated by TexSubImage2D if <format> is
|
||||
DEPTH_COMPONENT and <type> is not UNSIGNED_SHORT, or UNSIGNED_INT.
|
||||
|
||||
The error INVALID_OPERATION is generated by TexImage2D if <format> and
|
||||
<internalformat> are not DEPTH_COMPONENT and <type> is UNSIGNED_SHORT,
|
||||
or UNSIGNED_INT.
|
||||
|
||||
The error INVALID_OPERATION is generated by TexSubImage2D if <format> is
|
||||
not DEPTH_COMPONENT and <type> is UNSIGNED_SHORT, or UNSIGNED_INT.
|
||||
|
||||
The error INVALID_OPERATION is generated by TexImage2D if <format> and
|
||||
<internalformat> are DEPTH_STENCIL_OES and <type> is not
|
||||
UNSIGNED_INT_24_8_OES.
|
||||
|
||||
The error INVALID_OPERATION is generated by TexSubImage2D if <format>
|
||||
is DEPTH_STENCIL_OES and <type> is not UNSIGNED_INT_24_8_OES.
|
||||
|
||||
The error INVALID_OPERATION is generated by TexImage2D if <format> and
|
||||
<internalformat> is not DEPTH_STENCIL_OES and <type> is
|
||||
UNSIGNED_INT_24_8_OES.
|
||||
|
||||
The error INVALID_OPERATION is generated by TexSubImage2D if <format>
|
||||
is not DEPTH_STENCIL_OES and <type> is UNSIGNED_INT_24_8_OES.
|
||||
|
||||
The error INVALID_OPERATION is generated in the following situations:
|
||||
- TexImage2D is called with <format> and <internalformat> of
|
||||
DEPTH_COMPONENT or DEPTH_STENCIL_OES and
|
||||
- <target> is not TEXTURE_2D,
|
||||
- <data> is not NULL, or
|
||||
- <level> is not zero.
|
||||
- TexSubImage2D is called with <format> of DEPTH_COMPONENT or
|
||||
DEPTH_STENCIL_OES.
|
||||
- TexStorage2DEXT is called with <internalformat> of DEPTH_COMPONENT16,
|
||||
DEPTH_COMPONENT32_OES, or DEPTH24_STENCIL8_OES, and
|
||||
- <target> is not TEXTURE_2D, or
|
||||
- <levels> is not one.
|
||||
- CopyTexImage2D is called with an <internalformat> that has a base
|
||||
internal format of DEPTH_COMPONENT or DEPTH_STENCIL_OES.
|
||||
- CopyTexSubImage2D is called with a target texture that has a base
|
||||
internal format of DEPTH_COMPONENT or DEPTH_STENCIL_OES.
|
||||
- GenerateMipmap is called on a texture that has a base internal format
|
||||
of DEPTH_COMPONENT or DEPTH_STENCIL_OES.
|
||||
|
||||
New State
|
||||
|
||||
None.
|
||||
|
||||
Issues
|
||||
|
||||
1) What are the differences between this extension and OES_depth_texture
|
||||
and OES_packed_depth_stencil?
|
||||
|
||||
RESOLVED: This extension:
|
||||
- does not support loading pre-baked depth stencil data via
|
||||
TexImage2D or TexSubImage2D.
|
||||
- allows variability in the y-, z-, and w-components of the sample
|
||||
results from depth textures.
|
||||
- only supports one level textures.
|
||||
- explicitly lists the errors for unsupported functionality.
|
||||
Since these were not clearly specified in the OES_depth_texture
|
||||
extension there may be differences in error values between
|
||||
implementations of OES_depth_texture and ANGLE_depth_texture.
|
||||
This specification was also rebased to apply against the OpenGL ES 2.0
|
||||
specification instead of the OpenGL specification, making it more
|
||||
obvious what all the functionality changes are.
|
||||
|
||||
2) Why does TexSubImage2D accept the new format/type combinations even
|
||||
though it does not actually support loading data?
|
||||
|
||||
RESOLVED: This was done to be more consistent with the OES_depth_texture
|
||||
extension and to make it easier to add support for loading texture
|
||||
data if it is possible to support in the future.
|
||||
|
||||
3) Why are only 1-level depth textures supported?
|
||||
|
||||
RESOLVED: The only use for multiple levels of depth textures would
|
||||
be for fitlered texturing. However since it is not possible to
|
||||
render to non-zero-level texture levels in OpenGL ES 2.0, and since
|
||||
this extension forbids loading existing data and GenerateMipmap on
|
||||
depth textures, it is impossible to initialize or specify contents
|
||||
for non-zero levels of depth textures.
|
||||
|
||||
Revision History
|
||||
|
||||
02/25/2013 swoods revise to allow texture lookup to guarantee depth values
|
||||
only in red channel of sample result.
|
||||
06/04/2012 dgkoch fix errors, disallow multi-level depth textures.
|
||||
05/30/2012 dgkoch minor updates and add issues.
|
||||
05/23/2012 dgkoch intial revision based on OES_depth_texture and
|
||||
OES_packed_depth_stencil and rebased against the ES 2.0 spec
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user